This enables us to construct Bundles at various stages of
authorization:
- `Bundle<Unauthorized>`: A bundle with all effecting data but no
proofs or signatures.
- `Bundle<Authorized>`: A bundle with all proofs and signatures,
suitable for inclusion in a block.
- `Bundle<Partial>`: Example of some in-progress bundle authorization,
for example during a FROST threshold multisignature protocol.
Also adds the bundle flags field from ZIP 225.
There was push-back on having this crate require these traits, due to the
additional complexity within this crate. My rationale for including them
was to make it simpler to reason about what is responsible for enforcing
chain-specific constraints, and to reduce duplication (by enabling the
wrapping chain implementation to use type definitions and leverage all
built-in behaviour, instead of newtypes and needing to add a bunch of
wrapping logic and boilerplate, some of which would encode chain-specific
logic).
We'll try working within the requirement that this crate enforces minimal
base constraints and hard-codes any constants, and then have the wrapping
chain provide encoding prefixes and additional value constraints where
necessary.