Perform simple computations during compilation

If the arguments in the arithmetic operation are both immediate values,
the computation will be performed during the compilation.
Emit better code for array indexing
Implement CSE methods for Store

Stores can't be common subexpressions, so these are essentially no ops.
Implement equals and hashCode for Identifier
Implement common subexpression elimination
Disable CSE for opcodes that cannot be eliminated
Delete unused opcodes
Emit Ret instruction for return statement
Treat global arrays used only in main as locals
Add global parameter to load instruction

This will be used for CSE, since global variables can be modified during
function calls, a function call will kill the common subexpression
search.
Add argument getters for instruction base types
Use delete method in Instruction.performCSE
Specialize binary isCommonSubexpression
Specialize unary isCommonSubexpression
Add OrderIndependentBinaryInstruction

This class if for instructions where the order does not matter when
testing if they are a common subexpression. For example addition:
3 + 7 = 7 + 3
Make appropriate instructions order independant