Add MemoryRegion classes

These classes manage an area of memory and assign addresses to variables
and arrays in that region.
Add MemoryRegion field to Function

The memory region will manage the addresses of local arrays and spilled
local variables.
Change Type classes to use MemoryRegion objects
Change parser so addresses can be assigned to vars
Update reference outputs for array addresses
Add new test case for arrays
Change the way indexing code is generated

Since the addresses are known during compilation, it is possible to do
even more indexing arithmetic during compilation.
Update reference test outputs