Refactor DynamicScene to use Geometry & Appearances

**New Architecture overview**
`GeometryUpdater` is a new interface which is implemented by a class that wishes to map one of the `DynamicScene` types to an equivalent `GeometryInstance` and `Appearance`, i.e. `DynamicPolygon` is mapped to a `PolygonGeometry` backed `GeometryInstance` by the new `PolygonGeometryUpdater`.  For static data, updaters themselves don't actually create primitives, they just create geometry instances which are analyzed and batched further up the chain.  For dynamic data, each `GeometryUpdater` knows how to create a `DynamicGeometryUpdater` instance which manages a single primitive that represents that geometry from frame to frame.

`GeometryVisualizer` is a new `Visualizer` type that handles batching and management of the updater supplied instances.  It does not do much other than delegate to private helper classes, `StaticGeometryColorBatch`, `StaticGeometryPerMaterialBatch`, `StaticOutlineGeometryBatch`, and `DynamicGeometryBatch` (all of which should be self-explanatory).  These helper classes actually create primitives and handle the binning of items (i.e. colored geometry is binned into translucent/opaque categories).  GeometryVisualizer takes an Updater type in it's constructor, which means each visualizer only handles one type of geometry (by design).  This works well because it makes it easy for each geometry type to have it's own appearance, for example, PolylineGeometryUpdater uses the PolylineColorAppearance, instead of the default PerInstanceColorAppearance.

One design decision I made was to treat a filled and outlined geometry as either completely static or completely dynamic.  This is less efficient in the case where one is static and the other isn't, but this almost never happens (for example, having a dynamic `numberOfVerticalLines` property for Ellipse, but static everything else).  This decision basically makes the code a lot cleaner.  We can always optimize it later if it becomes an issue. That was my approach overall, clean and complete first, optimize later.

Static geometry is created asynchronously, while dynamic geometry is not.  We also only evaluate/iterate over instance attributes that actually change from frame to frame.  This is much more efficient than what is going on with the old visualizers in master.

**Other DynamicScene changes**

In order to support the above architecture, several changes and features had to be added to the underlying property system.

Properties now have an `isConstant` property which means the value is constant as far as simulation time goes.  The also have a `definitionChanged` event which fires if a mutable property is changed (for example, samples are added to SampledProperty).  Both of these changes are necessary in order to properly batch and managed geometry and updates.

DynamicPolygon/Ellipse/Ellipsoid/Polyline have new properties that mirror geometry options (`extrudedHeight` for example).  Their visualizers have been replaced with updaters.

The `propertyChanged` event on  DynamicScene objects has been renamed to `definitionChanged`.  Also, the event is now raised in the case of an existing property being modified as well as having a new property assigned (previously only property assignment would raise the event).

The `dynamicObject` property which got globbed onto all primitives for picking has been removed and replaced by using the `id` property, which is the correct way to do it anyway (and didn't exist when we first wrote this).

`DynamicDirectionsProperty` and `DynamicVertexPositionsProperty` were both hold-overs from the original `DynamicProperty` implementation.  I finally got around to deleting them and replaced them with `PropertyArray` and `PositionPropertyArray` which allows you to construct an array of `Property` objects that evaluates to an array whose values are the value of each property at that time.  This is also ground work for a `FormatterStringProperty`, which will allow for time-dynamic strings with sampled values.

**TODO Before ready for final review**
- [x] Finish documentation
- [x] Finish tests
- [x] Clean up changes to DataSourceDisplay
- [x] Update CHANGES.MD with full list of breaking changes and features