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 used to get push back from localization about including dynamically formatted lists in messages. I think its okay from a pragmatic perspective, but its worth being explicit that we're consciously doing this.