Cache the created ByteBuffer[] array when using gathering writes and handle a ByteBuf which is backed by more then one ByteBuffer.

This is done as generate the ByteBuffer[] arrays each time may be quite expensive in terms of allocation and GC