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

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

GenBCode will emit either:

  (a) an anonymous closure class and its instantiation ( under -closurify:delegating )
      or
  (b) a method handle given as constructor-argument to a closure instantiation ( under -closurify:MH )

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
  compiling test\files\continuations-run\t3223.scala
  with options -P:continuations:enable -Xpluginsdir build\quick\misc\scala-devel\plugins -Xplugin-require:continuations
  trips an assertion in GenBCode.