Scenegraph optimizations

Scenegraph is pretty snappy now, although there are plenty of opportunities left to optimize. Major changes:

* Added `TransformCache` class, which allows `ChainTransform` instances to be re-used across frames. This prevents most of the program recompiling.
* Canvas gets `ndc`, `framebuffer`, and `pixels` entities that are used to represent the coordinate systems it handles.
* Avoid generating throw-away `Variable` instances in `Function.__setitem__`. This was wasting a lot of time.

There is still some cleanup left to do, but once this is merged I think we finally have a usable scenegraph.
No, it is added to the stack in a different place. There was some disagreement between Canvas and DrawSystem about when entities should be pushed onto the stack, and this led to some entities pushed twice and others not pushed at all.