fusion: shortcut

don't need to to `compute . delay` array terms in scalar expressions, as these will only ever be array variables.
wibble
fusion: handling of array let bindings

Split into two cases: handling of the bound term and of the body. This avoids a complexity blowup from prematurely delaying the body term.
fusion: no need to delay embedding for an avar
fusion: backpermute might decay into reshape

Reshaping can be done in constant time without executing any array program.
hash and match instances for Delayed arrays
wibble
shuffle constants to the left in commutative operators
simplify: push tuple projection under let bindings
fusion: bug fix for aletD/permute case