Add a new crate, libsignal-message-backup-io, and move the existing code that
handles backup decryption, deframing, and protobuf deserialization there. Keep
the actual validation of the protobuf contents in the libsignal-message-backup
crate.
This allows the existing example binproto<->json binaries to be built with
local modifications to the backup.proto file without also requiring all the
validation code to be modified.
Add a derive macro and attach it to each generated protobuf message. The
generated code will walk each field in the message and dispatch recursively to
the same trait to find all unknown fields. Keep the existing
dynamically-dispatched descriptor-walking implementation since it's easier to
understand, but only use it to ensure parity with the macro-generated version
via test cases.