Add ArrayIndex instruction

This will be used to allow us to be as smart as possible when
determining the array indexing since we won't generate the actual
indexing code until all variables have been replaced with values.
Modify ArrayType to use ArrayIndex instruction
Add pass to generate explicit code for array index
Add pass to update the arguments

This is needed if instructions may have been deleted by a previous pass.
Use the pass to generate the smart array indexing
Update test reference outputs
Add arithmetic instruction type
Make order independent instructions arithmetic
Override arithmetic instruction methods
Rename OrderIndependentBinaryInstruction

Rename to OrderIndependentArithmeticInstruction