write a test that shows an actual side exit
a nested loop that shows the problem of bubble
implement RecLambda directly in Lambda

Lambda is getting a bit too complex, might change this again.
close over an outer var in example
cache closures when free variables stay the same

experimental, probably needs some more thought
Merge branch 'master' into cache-envs

Conflicts:
	pycket/interpreter.py
Merge branch 'master' into cache-envs

Conflicts:
	pycket/interpreter.py
Merge branch 'master' into cache-envs

Conflicts:
	pycket/interpreter.py
oops
fix after value refactoring
detect recursive lambdas in more cases

a lambda can also be recursive if the body of the letrec is an
application of the lambda's name but does not use the name in the
operands.
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
Merge branch 'master' into cache-envs
Merge branch 'master' into cache-envs
Merge branch 'master' into cache-envs

Conflicts:
	pycket/test/test_basic.py
Merge branch 'master' into cache-envs

Conflicts:
	pycket/interpreter.py
	pycket/test/test_ast.py