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 don't think it is appropriate to provide a core API that asks for an FK based just on the properties of the FK. I think when we discussed FKs we came to the conclusion that having two FKs with the same properties and the same referenced key was not useful. But having many FKs that share the same properties but which reference different keys at the principal end is normal and common.