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
What does it mean to get a primary key for a specific property or properties? Does this mean try to get the primary key but only if it matches the properties, otherwise don't get the primary key even though it may exist? This seems confusing to me.