Adjust CreateDerivedArrayType to also take the lower bound.

Since valid array bounds vary by language, this needs to be passed
in by the source language creating the derived type. Adjust callers
accordingly.
Fix array typecasting.

Since a C/C++ array is essentially pointer math, the derived type
needs to take this into account, otherwise the array indices wind
up being based off the address of the variable itself rather than
the array it points to.
Slight cosmetic adjustment.

If the current node is an address type and has as its only child an array type,
use the same approach we do for pointers to objects and hide the intermediate
dereference.
Fix reference leak.
Improve debug output.

Should make it easier to determine the exact reason the debugger
call is triggered.