fusion: rewrite (again) and vastly improve complexity

The key change is to separate the existential type carrying the change in environment, from the representation of how to generate the array. Previously, aligning the environments of terms so that they could be manipulated resulted in significant additional work converting between the delayed and AST forms.
pretty printing for delayed arrays
fusion/aletD: add TODO
indicate whether any work was done during shrink or simplify

The simplification process can stop as soon as no more changes are made, without needing to compare the new and old expressions via `match`.