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.
Again, changing from if else to switch case statement is not necessary. Furthermore it could lead to problems if an unsupported mode is passed it. The if else makes it clear which modes are supported and it only executes code in the conditional if a supported mode is observed. The switch case will try to execute the default statement even if wean invalid or unsupported mode is passed in. This is not desirable behavior.