Interfaces and classes for representing and observing properties of objects.

## Package Specification

This package and its subpackages provide the `IProperty`, `IValueProperty`, `IListProperty`, `ISetProperty` and `IMapProperty` interfaces, along with classes which serve as base implementations of each interface.

Properties are intended to serve as a convenient path to creating observables for observing specific attributes of source objects. The main goals of this API are:

- Simplify the process of creating custom observables. Developing custom observables correctly can be tricky, so the properties API tries to ease this burden by providing all the observable implementations. Property implementers only need to extend one of the provided base classes (`SimpleValueProperty`, `SimpleListProperty`, `SimpleSetProperty` or `SimpleMapProperty`) and implement a handful of abstract methods which the observables use to function.
- Simplify observation of nested properties. Traditionally observing a nested property required creating an observable for the first property, then wrapping that observable in a master-detail observable for each successive property in the chain. Using property chaining it is trivial to define a nested property and to observe that property on a particular source object.

A set of delegating properties are also provided (`DelegatingValueProperty`, `DelegatingListProperty`, `DelegatingSetProperty` and `DelegatingMapProperty`) which may be used to implement properties where the property behavior depends on the type of source object.