Print if-else-if chains in a nicer way.
Consider more simple methods for inlining.
Fold If constructs.
Discard side-effects of statements.
Optimize pattern matches.
Merge pull request #835 from sjrd/opt-pattern-matches

Several new optimizations that give better translations for pattern matches
Circular inlining detection and prevention.
Merge pull request #837 from sjrd/prevent-circular-inlining

Circular inlining detection and prevention.
Patch generated local vars as vals if they are not mutated.

This is important for optimizations to be able to kick in with
enough accuracy. There are typically 2 kinds of such local vars
that are handled by this:
* ParamDefs of tail recursive methods
* Variables captured by lambdas or inner classes, and thus
  transformed to instances of IntRef/ObjectRef/etc. by
  lambdalift.
(not to mention vars declared by the programmer that they don't
mutate.)
Merge pull request #836 from sjrd/refine-vars-as-vals

Patch generated local vars as vals if they are not mutated.
Add support for passing LocalDefs through chains.

So that it becomes possible to inline a closure used two
levels of inlining (or more) from where it is declared.
Handle This() more like VarRef() in the optimizer.
Merge pull request #838 from sjrd/better-val-aliasing

Better val and this aliasing