add scalar iteration to the surface language

'iterate' has a fixed iteration depth. 'while' loops while the predicate holds.
don't adjust the ordering of &&* and ||*
parameterise term hashing by the recursive knot
parameterise term matching by the recursive knot
repeat scalar simplifications until no changes are made
rewrite x/1 = x; wibbles