Changed metadata to be grouped into an array of concrete objects

The problem here is that somehow, the metadata type needs to be
declared. In normal metadata, this is done when the metadata is
requested. This particular iteration declares the metadata type when
the grouping is being declared so that it knows what type to cast the
grouping to.
Changed Core metadata view provider to handle recursive metadata

This is much more flexible in that now any property of a metadata view
type can hold more metadata, so long as the metadata for that property
was registered as either an IDictionary<string, object> or
IDictionary<string, object>[].