Add a `Blob` struct, versioning

Usage of `Blob` _drastically_ simplifies accessing the fields of a large byte
array during encryption/decryption.

A version field is now tacked on to the front of all encrypted blobs. This
allows the `decrypt` method to detect the version of the blob its dealing with,
then try to handle it appropriately. Since there's currently only a single
version, the mechanism by which old versions are dealt with is left
unimplemented.

To make the system work with the new `Blob` struct, the pattern of
adding/removing things from a byte array to sign/whatever it has been refactored
to simply return the requisite bytes. This allows us to insert them directly
into the Blob struct and work with it there.