Using the AEAD modes should be made fallible, or use type states
In most AEAD modes, supplying more AAD after encrypting/decrypting is an error, and our abstraction should enforce that to align implementations.
Either make functions fallible, or use type states to prevent misuse.