Avoid materialization of frames by reifying upvalues

In order to avoid materialization of Truffle frames, all points to frames need to be avoided. However, SOM required so far frame pointers to access the variables of outer lexical blocks.

By reifying these variables to so-called upvalues, and representing them by upvalue arrays, we do not longer store them in the frame, but in the argument object and can pass on a pointer to these argument objects. This allows us to avoid accessing the frames in ways that are not really supported by Truffle.

The compiler now keeps track of variable access by introducing Variable objects with the corresponding information.

The argument objects now have an upvalue slot, which references an Object array that stores the upvalues.
An invokable knows the number of required upvalues to initialize its Arguments objects properly.

Argument and variable accesses are now represented by a variety of different node types. Arguments are read by special ArgumentReadNodes, and variables are initially UninitializedVariableNodes to avoid a second pass of the compiler.
These UninitializedVariableNodes specialize based on the characteristics of the variable they access, which are only known once a whole method and all its blocks has been compiled.
Normal variables are represented by LocalVariableNodes and are stored in the frame. Upvalues are represented by NonLocalVariableNodes and these nodes access the upvalue array.

[TODO-REPORT: design of upvalues, and that it is a major thing required for Truffle+Graal]

Signed-off-by: Stefan Marr <git@stefan-marr.de>