The first step ICSharpCode.Decompiler performs to decompile a method is to
translate the IL code into the 'ILAst'.

An ILAst node (ILInstruction in the code) usually has other nodes as arguments,
and performs a computation with the result of those arguments.

The evaluation of a node results in either:
 * a value
 * void (which is invalid as an argument, but nodes in blocks may produce void results)
 * a thrown exception (which stops further evaluation until a matching catch block)
 * the execution of a branch instruction (which also stops evaluation until we reach the block container that contains the branch target)

The main differences between IL and ILAst are:
 * ILAst instructions may form trees
 * Types are explicit, not implicit
 * There is no evaluation stack
   * Instead, "stack slot" variables are introduced