Centralize key encoding and decoding

Centralize the encoding and decoding of a bucket key into a single
BucketKey class.  This allows us to not only encode and decode a
bucket's key easily, but to also determine the bucket key version.
This will deprecate the Limit.key() and Limit.decode() methods.
Move the DeferLimit exception to the top of the file.