refactor(chain)!: split canonicalization into two tasks with generic `Canonical<A, P>`
Separate concerns by splitting `CanonicalizationTask` into two phases:
1. `CanonicalTask` determines which transactions are canonical and why
(`CanonicalReason`), outputting `CanonicalTxs<A>`.
2. `CanonicalViewTask` resolves reasons into `ChainPosition`s (confirmed
vs unconfirmed), outputting `CanonicalView<A>`.
Make `Canonical<A, P>`, `CanonicalTx<P>`, and `FullTxOut<P>` generic over
the position type so the same structs serve both phases. Add
`LocalChain::canonical_view()` convenience method for the common two-step
pipeline.