specializeTypes.specializedFunctionX for use by Late-Closure-Classes
fix to future-spec test, req for Late-Closure-Classes
Late Anonymous-Closure Classes: GenBCode dehydrates them (+ TODO)

Transform a Function node
  (x_1,...,x_n) => body
of type
  FunctionN[T_1, .., T_N, R]
into a Block expression of the form:

    {
      def hoisted(x_1: T_1, ..., x_N: T_n): R = body

       ScalaRunTime.lccMethodDisguiser(
         hoisted(zeroes-for-params-above)
       ).asInstanceOf[AbstractFunctionN[T_1, .., T_N, R]]
    }

where `ScalaRunTime.lccMethodDisguiser()` denotes a synthetic, artifact
method symbol created in Definitions, that thus doesn't occur
in user programs.

In place of the above, GenBCode will emit
under `-closurify:delegating` the following:
  - an anonymous closure class, and
  - its instantiation.

That way, the compiler has less work to do during specialize,
explicitouter, erasure, and lambdalift, among others.

The resulting anon-closure-classes have smaller constant pools,
which significantly shrinks output size (good for mobile devices).
Further classfile-size reductions can be obtained using -neo:o1
(ie intra-method optimizations, which lower the instruction count).

TODO an assertion is tripped in GenBCode upon compiling
    test/files/continuations-run/t3223.scala
  with options
    -P:continuations:enable -Xpluginsdir build/quick/misc/scala-devel/plugins -Xplugin-require:continuations
squash outer pointer of Late-Closure-Classes

During UnCurry, closureConversionModern() lowers a Function node into
a Block of the form:

    {
      def hoisted(x_1: T_1, ..., x_N: T_n): R = body

       ScalaRunTime.lccMethodDisguiser(
         hoisted(zeroes-for-params-above)
       ).asInstanceOf[AbstractFunctionN[T_1, .., T_N, R]]
    }

The "hoisted" method becomes a bytecode-level instance-method,
unless the class declaring it is an implementation-class derived
from a trait (in which case "hoisted" becomes
a bytecode-level static method).

An instance "hoisted" method usually implies that an outer-pointer
is required by the anon-closure-class (unless the class declaring
the "hoisted method" is a Scala-level static module, in which case
the anon-closure knows how to grab the correct instance via
GETSTATIC MODULE$ thus doing without an outer-pointer)

Oftentimes an instance "hoisted method" actually does not depend
on THIS, or depends only on lifted-methods (thus not part of
the public API) which themselves exhibit such property (not depend
on THIS or depend only on methods that don't actually require THIS).

In class LCCOuterSquasher, method squashOuterForLCC() detects
the largest subset of "hoisted methods" (aka endpoints)
that can be made static, under the constraint that only
lifted-methods can be made static. This constraint amounts
to leaving the public API unchanged.

Once that subset has been determined, all usages of those
"must-be-made-static" methods are found, and rewritten as appropriate.

Finally, each Late-Closure-Class amenable to this transformation
is refactored:
  - its $outer field is removed,
  - its constructor is adapted removing the param for outer-pointer.

Compiler flag -Ylog:jvm informs which anon-closures have
their outer-pointer squashed.