Fix regression introduced by 0364265f4692b2f2f28ab36037c4ab6f3c242eae which could lead to corrupt attribute values
[#1454] Fix IndexOutOfBoundsException which was thrown if last component of a CompositeByteBuf was removed
Add ChannelConfig.maxMessagesPerRead and ChannelOption.MAX_MESSAGES_PER_READ

- Fixes #1486
- Make sure AbstractNioMessageChannel.NioMessageUnsafe.read() only up to maxMessagesPerRead
Make NioByteUnsafe.read() respect ChannelConfig.maxMessagesPerRead and adjust the default from 16 to 1

- Fixes #1486
- Decreased the default from 16 to 1 because unnecessary extra read on req-res protocols results in lower throughput due to extra syscalls.
Improve the documentation of MessageList

- Fixes #1459
Fix naming
Add WebSocketClientHandshaker.close()

- Fixes #1470
Fix FileServer example
[#1474] Make sure testsuite also pass when no network/internet connection is present
Allow specifying 0 as the default number of threads when instantiating an EventLoopGroup

- Fixes #1426
- We already allow a user instantiate an EventLoopGroup with the default number of threads via the default constructor, so I think it's OK although it's not always optimal.
Add ByteBufProcessor and ByteBuf.forEach(...)

- Fixes #1378
- Needs to provide optimized forEach implementations though.
Deprecate ByteBufIndexFinder

- Prefer ByteBufProcessor
- Related: #1378
Use (fromIndex, toIndex) instead of (index, length) for ByteBuf.forEachByte(...)

- Related: #1378
Optimize derived buffers' forEachByte(...) implementation

- Related: #1378
Fix test failure in SlicedByteBuf / Add tests for built-in ByteBufProcessor impls

- Related: #1378
Split ByteBuf.forEachByte() into forEachByte() and forEachByteDesc()

- Related: #1378
- As suggested by @liqweed
Update Javadoc of ByteBufProcessor and MessageListProcessor

- in response to @shacharo's suggestion
Throw IllegalStateException if implementations of ByteToMessageDecoder and ByteToMessageCodec use @Sharable
Vastly simplified ByteBufProcessor and MessageListProcessor

- Related: #1378
- They now accept only one argument.
- A user who wants to use a buffer for more complex use cases, he or she can always access the buffer directly via memoryAddress() and array()
Add MessageList.array() / Rewrite MessageList.add(T[], int, int)

- MessageList.array() should give better performance + concise code
- MessageList.add(T[], int, int) iterated over the source array 3 times at worst case. This commit reduces that to 1 time.