Make SClass.addInstanceInvokable private and make primitive loading error fatal

Signed-off-by: Stefan Marr <git@stefan-marr.de>
Make systemObject a field of Universe

- to be accessible by the VM at a later point without going through globals

Signed-off-by: Stefan Marr <git@stefan-marr.de>
Completed the type system to include all VM classes

- added the necessary execute methods to ExpressionNode
[TODO-REPORT: the execute methods define which specializations can be done in nodes, I think the return types are used to derive how to compose the evaluation in a way that a specialization can be executed.]

Signed-off-by: Stefan Marr <git@stefan-marr.de>
Complete refactoring of execution strategy to utilize Truffle DSL

This is a major rewrite of the Truffle-based execution system. Instead of relying on a general MessageNode, we need to introduce Unary, Binary, and Ternary nodes to use the Truffle DSL specialization features properly. For variable arguments, we still keep the KeywordMessage nodes around. However, the specific node types are needed to have a specialization down to the argument level of execution methods of a node. For instance, an addition needs to get the receiver and the argument evaluated properly. That's not supported by the DSL otherwise.

The NodeFactory should now be used for all 'higher-level'/'higher-complexity' node creations. (Refactoring needs to be completed still)

#if* and #while* related nodes have be split into classes for each selector.

Primitives are rewritten so that each primitive node class represents one operation (i.e., selector) and implementers all variants for all types.
Not yet clear is whether this is going to work well for primitives. Especially since we still want to enable classes to override primitives in subclasses, and since we need to handle polymorphism in a way that works. Also need to avoid primitives becoming polymorphic sends when it is not necessary!

TODO:
 * Cloning for inlining needs to be implemented
 * Move all 'complex' node creation stuff into NodeFactory
 * Primitives can be further optimized by using primitive types, avoid boxing, using ExactMath, etc.
 * verify polymorphism works properly with new Primitive design

[TODO-REPORT: give an overview of the final node type hierarchy, and the transitions between optimization states]

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