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.
I still prefer the switch case because it is a more compact syntax. The if else statement is in some sense safer, but there is also no final else part to handle the case where the mode matches none of the known modes.

I can change the switch statement to explicitly list all the cases and have a default that does nothing. This would be equivalent to the if else, but just more compact.