This class implements an array-backed circular list.
The head and tail chase each other up and down the buffer, and will wrap around as required. When/if they wrap around we will have two
non-contiguous segments: a head segment that runs to the end of the buffer, and a tail segment that starts at position 0.
A wrapped list can be identified by the fact that the tail index will be less than the head. Indeed, if we find ourselves operating on
any elements whose index is less than the head or greater than the tail, then we're dealing with a wrapped list.