proto.Key and proto.EncKey for better static type checking!

Moved engine.Key to proto.Key and introduced a new proto.EncKey to
differentiate between unencoded keys and encoded keys. All engine
interfaces (lowest level) expected proto.EncKey. Higher level interface,
such as storage.MVCCC and storage.DB accept proto.Key.

These are now custom gogoproto types in the .proto files.
Does gogoproto make any guarantees about the memory pointed to by this `[]byte`? We might want to make a copy instead of just pointing into whatever block of memory they're handing us, unless they make that copy for us.