Teeny little improvement: rather than using iterator and for(:) loops I
opted to add .apply(action) methods to ComplexArray for iterations, and
(mis)use a single ComplexElement adaptor to do the iterations.  Thinking
about making TransformationState just supply a bunch of actors instead
of doing the stuff in house.  Added some logic to delay transforming
until matrices are updated once.
Went with the apply approach, tried to clean up stuff a bit.  Still pan
and zoom are weirdly stuck.  Significant shuffling of
TransformationState.
Fixed the translation issue - problem was that it was unnecessary to
explicitly apply the newly updated affine transformation to the params -
rather it was only necessary to update the transformation itself, and
notify observers to rescale and draw.  Now something is wacky with the
params - looks a bit like there is an extra zero or something.  Not as
bad though, getting close!