SI-7622 Clean Up Phase Assembly

"Clean" here means that a component can declare cleanly if it is "enabled",
whether it is an "initial" or "terminal" phase, and the user can tell from
-Xshow-phases what phases are configured, and by adding -Ydebug, what
components are available but not turned on.

Disabled components are listed with an icon instead of a phase number:
xx for phases that are not enabled (such as by a compiler option),
and oo for phases that disabled by -Yskip.

Compiler options that take phases as settings ("PhasesSettings") are now
sanity-checked at phase assembly.

As usual, phases can be specified as name prefixes or ranges of ids.

The few options that exclude a phase from the run (-Yskip and -Ystop) are
required to name the phase. (A future improvement may be to permit
-optimise -Yskip:23-27, i.e., turn on the flag but skip the phases without
writing -Yskip:inline,inlinehandlers,etc.)

Generating the .dot file is an "info" option like -Xshow-phases. If "phase assembly"
hits an error, it will dump the .dot file instead of asking you to re-run. That's
because if phase assembly caused the problem it might not be easy to
reproduce.

The current "phase assembly" code works a lot better when the object you
put into hash tables actually have meaningful hash codes.  The unstable
test of detecting cycles is moved out of pending.