yet different approach to recursive lambdas

- recursive lambdas are turned into lets generally (which saves the
  introduction of a cell).

- there is an extra optimization that removes simple lets, that often
  works for these lets created:

  (let ([a x]) a) -> x
  (let ([a x]) (a ... args)) -> (x ... args) if a does not appear in
  args
don't do reclambda opt at all if set! is used
optimize (let ([a x]) (if a ...))
give the body of lambda its own AST node

this makes it possible to do special things at the very beginning of a
trace (needing slightly weird code).
this is no longer needed now