Make MetadataStore and MetadataProvider <T extends Metadatable>

This allows for better generic guarantees.
Implement per-class canonical provider map