An incremental optimizer consumes the reachability analysis produced by
an Analyzer, as well as trees for classes, trait impls, etc., and
optimizes them in an incremental way.
It maintains state between runs to do a minimal amount of work on every
run, based on detecting what parts of the program must be re-optimized,
and keeping optimized results from previous runs for the rest.
Checker for the validity of the IR.
An abstract builder taking IR or JSTrees
Scala.js optimizer: does type-aware global dce.