Improve DataSource geometry instance attribute performance

Geometry instance attributes are much more expensive to set than I realized when I implemented DataSource geometry batching.  This modifies the batching code to cache the last attribute value and only set it if it's changed.  This improves performance by doing less work, but also greatly reduces the amount of garbage generated in scenarios with lots of geometry that change color or visibility over time.

There's no externally visible changes here other than improved performance.