Expression cleanup
Checkpoint
Checkpoint
Changed Omega-Rect representation to tree

Computation combinators can now easily send subtrees to subcomputations.
This and carefully preserving eq?-ness in Omega-Rect operations (e.g.
set, join, intersect) makes it easy for the subcomputations to detect
when a previous refinement hasn't changed anything that will affect
their meaning. IOW, when their part of the random store is identical to
their part of the previous random store, and the environment is identical
to the previous environment, they can return the previous meaning.

Because refinement produces only subsets, and because approximate images
and preimages are monotone, computations need to cache only their previous
meaning (and of course pointers to their previous arguments)... if there
isn't a lot of backtracking. The sampler doesn't restore cached previous
computations when it backtracks.

When a completely unrolled program is a balanced tree with n leaves,
this strategy can reduce running time from O(n^2) to O(n*log(n)). When
the program isn't balanced, it's still O(n^2). I wonder whether the
forward-backward nature of this kind of computation makes cons lists
more harmful than they would be otherwise...