Handy array handle. Allows us to specify all or part of an array buffer without having to pass around the 3 separate
parameters that describe it (buffer, offset, length).
Note that Java generics don't take primitive types like byte and char, so instances of this class have to be declared
with T as byte, char, Object etc. It does not make sense for T to be anything other than an array.
Note that since this class is basically a glorified pointer, the Equals method merely checks that they both point to
the same memory location.
The fact that two ArrayRef objects point at different buffers does not mean that the pointed-to contents are unequal
in terms of their own array-class semantics, but they are unequal from the point of view of this class, so if you are
interested in that sort of equality, this method is not relevant.
Subclasses of ArrayRef must override this method, if they are in a position to know what their array type is and expect
equals() to take the buffer contents into account.