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
I think Remove methods should be no-op if the item doesn't exist. This is the general pattern used for most collections because it usually isn't useful to throw and forces callers to use an explicit check before calling Remove in cases where they might not know whether the item exists or not.