Strings, multi-statement bodies, "define" hoisting

- Strings: self-explanatory
- Lambdas and function definitions can have multiple statements in their
  bodies. Useful for printing multiple pieces of data.
- All defines at the top-level are executed before anything else, so
  they are available even before they are defined, as long as they are
  defined at the top level.
Definition hoisting within lambdas

In implementing this, I cleaned up the static analysis and
transformation implementation quite a bit. I think this makes the logic
much clearer and enables more transformations in the future.