Change type of 'main' field in {SsaTree,SsaTree2}.Program.T

Change type of 'main' field in {SsaTree,SsaTree2}.Program.T from
"FuncEntry.t" to "{entry: FuncEntry.t, func: Func.t}".  This is the
type of the 'main' filed in Rssa.Program.T and, as discussed in
c536cac, there are a number of instances where accessors wanted both
"main, the collection of blocks" and "main, the entry to start at".
Add sub-structure Forest to structure Tree

Introduce a number of utility functions for direct processing of
forests (sequences of trees).
Use Tree.Forest.layoutDot for displaying dom forest in SSA/SSA2
Move DuplicateEntries pass to front of SSA simplify pipeline.

Moving this diagnostic pass to the front of the SSA simplify pipeline
will force all subsequent optimizations to deal with truly multi-entry
functions.
Copy RemoveUnused pass.

Prepare to convert RemoveUnused to multi-entry.
Enable existing multi-entry SSA passes.
Use single-entry or multi-entry pipeline exclusively.

Now that the multi-entry pipeline produces an unchanged MachineIL
program that is compatible with the codegens, there isn't a strong
reason to resume the single-entry pipeline after the multi-entry
pipeline completes.  Furthermore, the diagnostics that save
information about individual optimization passes sometimes results in
identical file names for both pipelines, overwriting the multi-entry
diagnostics with single-entry diagnostics.  As we begin to port
optimization passes to the multi-entry ILs, it will be important to
access these diagnostics easily.
Convert RemoveUnused to multi-entry.

No significant difficulties with the conversion.
Copy RemoveUnused2 pass.

Prepare to convert RemoveUnused2 to multi-entry.
Copy SSA2_TRANSFORM signature.

Prepare to convert SSA2_TRANSFORM to multi-entry.
Convert SSA2_TRANSFORM to multi-entry.
Convert RemoveUnused2 to multi-entry.

No significant difficulties with the conversion.
Copy IntroduceLoops pass.

Prepare to convert IntroduceLoops to multi-entry.
Convert IntroduceLoops to multi-entry.

No significant difficulties with the conversion.  The only interesting
facet is that each entry may introduce a loop and a self tail call
must jump to the appropriate loop.
Convert LoopInvariant to multi-entry.

Trivial conversion.
Convert LocalFlatten to multi-entry.

Trivial conversion.
Convert SimplifyTypes to multi-entry.

No significant difficulties with the conversion.
Convert CombineConversions to multi-entry.

Trivial conversion.
Convert CommonArg to multi-entry.

Trivial conversion.
Convert CommonBlock to multi-entry.

Trivial conversion.