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 would like to get some input from Diego and/or Andrew on this. Index is such a general concept used in so many ways that it seems like it may be necessary to allow two index objects attributed in possibly provider-specific ways that both reference the same set of properties.