ability to specify a type for derived properties

By specifying a dataType for derived properties, a derived property with `type:"state"` can dynamically have listeners updated when it returns a different state.

Derived types also allow for custom behavior by adding new dataTypes.