Adding new BatchQ for batched pointers

BatchQ passes unsafe.Pointer just like PointerQ it also allows for the
batching of writes and reads, similar to LLChunkQ.

The interface has a two phase process for both reads and writes,
organised in *Buffer(...) Commit*(...) pairs.

q.WriteBuffer(bufferSize int64) []unsafe.Pointer
q.CommitWrite(writeSize int64)

q.ReadBuffer(bufferSize int64) []unsafe.Pointer
q.CommitRead(readSize int64)

A reader/writer must first acquire a buffer for writing or reading and
when they have completed the reads/writes they must commit.

The size of the buffer returned is always <= bufferSize argument and can
be zero. The read/writeSize argument must be <= the size of the buffer
acquired.
head/tail indices not in fatomic.Padded64Int64

Previously we held each of our head/tail and head/tailCache indices in
their own cache line padded structures to prevent false sharing. Now
they are separated into blocks of ordinary int64 values protected by
unused cacheline padding.

This appears to have no performance impact but is a significant
improvement in code clarity.
head -> read, tail -> write rename

All variables called head have been renamed to read, because we always
use head and headCache to indicate where reads should start from.
Likewise all variables called tail have been renamed to write, because
we always use tail and tailCache to indicate where writes should start
from.