Level 3, new optimizer: GC-savvy closures (singleton closures, minimal closure state)

Compiler flag -neo:o3 activates three closure-related optimizations:

  (1) Some anonymous closures depend only on apply() arguments, ie they capture no values.
      In such cases, -neo:o3 emits code that avoids repeated closure allocations by keeping
      (in a static field added to that effect) a singleton-instance that is reused.

  (2) Lack of usages of a Late-Closure-Class (eg as a result of dead-code elimination) means the closure can be elided,
      along with its endpoint. This may lead to further tree-shaking (via UnusedPrivateDetector).

  (3) Minimization of closure-fields (in particular, outer) to those actually used.
      Field removal requires adapting both the closure allocation site, and the Late-Closure-Class itself.
      For example, removing the outer-pointer also requires turning the closure's endpoint into a static method.
      Closure allocations remain, but with smaller GC overhead.