Making the EntityType API more consitent

 1. Adding missing methods
 2. Using the same parameters for all methods operating on a specific metadata type.
 3. Adding missing NotNull annotations
 4. Ensuring the uniqueness of the metadata items
 5. Providing more helpfull exceptions
 6. Treating the primary key as a key in TryGetKey and related methods
We need to make sure that when we remove an existing piece of metadata and replace it with a new one any annotations are copied over. However, this could be a problem where the annotations only make sense before the move. I have a note to file an issue on this; it may require some more thought.