Breaking out calculation of freeVars into MiniCore/Transforms/Utils.hs
Add type-synonyms for nodes decorated with free-variable information
Clean up Transforms/Utils.hs and expose freeVarsExpr which allows one to annotate a single expression with free-variable information
Lift Transforms/Lambdas.hs into Stage monad transformer
Adding Transforms/StronglyConnectedComponents.hs

In "Implementing Functional Languages" this is used to implement full
laziness. I'm using it to transform a program like this:

fix f = f (fix f);
id x = x;
main = fix id;

into a single let(rec) like this:

letrec {
    fix = \f -> f (fix f);
} in let {
    id = \x -> x;
} in let {
    main = fix id;
} in main;

for type-checking. This ensures that we maximize polymorphism. Initially, we
would just put everything into a single letrec like so:

letrec {
    fix = \f -> f (fix f);
    id = \x -> x;
    main = fix id;
} in main;

but then id is monomorphic in the definition of main.
Using simplifyExpr to improve type inference in Inference.hs

As explained in previous commit, the code in StronglyConnectedComponents.hs
allows us to split a program into minimal nested let(recs).
Inference.inferTypes now uses this to transform the program before
typechecking.