Rename DirectedGraph.dfsTrees to DirectedGraph.dfsForest.
Change result type of DirectedGraph.dfsForest.

Change the result type of DirectedGraph.dfsForest from
"'b Tree.t list" to "'b Tree.t vector" to match the type of children
of a "'b Tree.t".
Alphabetize specifications in signature DIRECTED_GRAPH.
Implement dominators for a multi-root graph.

Extend the notion of dominators to accomodate graphs with multiple
roots.

Consider a directed graph G with roots {r1, ..., rn}.  A node n
*dominates* a node m if every path from a root to m must include n.
(Every node dominates itself.)  A node n *strictly dominates* m if n
dominates m and n is not equal to m.  A node n is the *immediate
dominator* of a node m if n strictly dominates m and there is no node
p such that n strictly dominates p and p strictly dominates m.

When considering a graph with a single root, there is exactly one
(reachable) node that has no immediate dominator: the root node.
Hence, the immediate dominator relation can be represented as a tree.

When considering a graph with multiple roots, there are multiple nodes
that have no immediate dominator.  Each root has no immediate
dominator.  Furthermore, any node that is reachable from two roots via
paths with no common nodes has no immediate dominator.  Hence, the
immediate dominator relation cannot be represented as a tree, but it
can be represented as a forest (i.e., a collection of trees).

The implementation is a straight-forward adaptation of the traditional
single-root dominator computation.  Within the implementation, we
implicitly maintain a "fake root" that is a predecessor of each
explicit root.
Simplify dominatorForest computations.

Use DirectedGraph.dominatorForest to simplify
MeSsaTree.Function.dominatorForest,
MeSsa2Tree.Function.dominatorForest, and
MeRssa.Function.dominatorForest.

Previously, these functions used DirectedGraph.dominatorTree by
introducing a fake root block/node that is a predecessor of every
entry start block.
Various updates to DIRECTED_GRAPH motivated by multi-entry functions.

Merge branch 'multi-entry-funcs--directed-graph' of
github.com:MatthewFluet/mlton into multi-entry-funcs