compiler.cfg.linear-scan.*: refactoring to simplify init-allocator and get rid of init-unhandled
compiler.cfg.*: more docs
compiler.cfg.scheduling: refactoring to use the simple-optimization combinator
tools.gc-decode.tests: another tough test
compiler.cfg.linear-scan.allocation.*: maybe a fix for #1227

The register allocator pops from the unhandled-intervals and
unhandled-sync-points heaps. If two live intervals share the same
start slot, then they can be popped in either order leading to
differently generated code. So instead use one
heap (unhandled-min-heap) and both the start and end slot as the heap
key to resolve tie-breakers
compiler.cfg.linear-scan.allocation.state: doc fixing