Type Extensibility update

Reworked the way type extensibility is implemented in the API. The
different between Effect/Property/Attribute/MetaData was confusing.
Different extension points defined different class hierarchies,
potentially resulting in duplication of code. Extensible type factories
couldn't take advantage of abstract management since they were not data
types. These factories were required to be configured, which forces null
checks all over the place, as opposed to just the lack of registration
of mapped properties builders.
The new implementation defines Properties on many classes, and one
common PropertyProvider. The PropertyProvider provides out-of-the-box
storage for instances, and pretteh sweet generic configuration. Of
course, the PropertyProvider and associated property fields on API
classes were designed to be completely optional.
Updated tests.