[B+C] Support registering Metadata Providers. Fixes BUKKIT-3625

**Note** This pull request supercedes #1032. I did this to rebase this onto master and squash the commits down removing all the old implementation details prior to a complete overhaul at the suggestion of Wolvereness.

* implement generic metadata provider registration/unregistration
   Implementation details are handled cleanly by a support class and the
   world-scoped metadata is handled as well by implementing the registry
   per-class instead of per-object
* Keep canonical lists of providers
   This allows registering providers for any metadatable class, not just
   the base classes available in stores, which will reduce confusion and
   also make it so provider "events" are only called for more specific
   classes if applicable.