Start work for GC support.

The objective is to add support for the GC interface provided
by LLVM, as explained in

    http://llvm.org/docs/GarbageCollection.html.

To do this, we need to identify every root in an expression. A root
is a variable that needs to survive a garbage collection. In particular,
it has to be a variable of structured type (such as tuples, arrays,
closure, etc.). The approach follows closely that of Zaynah Dargaye's
work on MLCompCert, as described in Chapter 6 of her thesis

    http://pauillac.inria.fr/~dargaye/pub/main.pdf.

We introduce a new intermediate language (called Gc) that makes
a difference between normal variables and roots. It is really quite
close to the method described in the thesis, the only difference being
that we only mark as roots those variables of structured types (in
the case of MLCompCert ALL variables are of this form). We just note
that some heuristics are used to avoid marking as roots all variables
of structure type (see the function Emit.roots for the heuristics).

The Gc phase is not yet wired in to the rest of the compiler. Next,
we need to modify Emit to take Gc as input (this will be easy) and
then we can plug Gc into the rest of the compiler, just between
Closure and Emit.

I also added one small test case test/fun-roots.ml to test the root
locator.