Protobuf writing/reading support on KeyVersions.

## Basic Concepts:
* After you create a KeyVersion you can protobuf it by doing kv.buildData().
* You can restore the KeyVersion by doing new KV.Builder().withData(protobuf).build().
* All KeyVersion sub-classes must conform to this paradigm.
* Internally, KeyVersions generate a "core" protobuf which is part of the "data" protobuf. The "data" proto holds ALL the fields needed to persist the KV, while the "core" contains ONLY the fields that will be hashed to obtain the key version ID. The raw bytes of the core will be fixed once it is generated and persisted.

## Summary of Changes:
* Added protocol buffer definitions.
* Removed all placeholders (don't need them any more).
* Moved KeyVersionBuilder to KeyVersion.Builder.
* Added methods on KeyVersion and Builder for sub-classes to override.
* Modified HMACKeyVersion and AESKeyVersion to override these methods and conform to the structure.
* Added input checks on the Builders.
We can discuss this, but I think BuilderException should be thrown for cases where there is a more complex issue with the (combination) of arguments provided. I think it is acceptable to throw a NPE for local programming mistakes like null pointer arguments.