Make array.copy more space efficient

This is also necessary to avoid cases where it thinks an array is too
small even if it can fit a value (since it used to consider the worst
case possible).
Support two's complement