Added improved implementation.

Added an alternative implementation for ProtoVariant. The primary change is that instead of having properties for all types we support, we just have a few properties and depend on a VariantType to identify the type of the variant. This implementation is a lot more flexible and supports a lot more types.