[#2523] Fix infinite-loop when remove attribute and create the same attribute again

Motivation:
The current DefaultAttributeMap cause an infinite-loop when the user removes an attribute and create the same attribute again. This regression was introduced by c3bd7a8ff10021026b0c223d36f022dbbf4fe397.

Modification:
Correctly break out loop

Result:
No infinite-loop anymore.
Fix broken CompositeMatcher

Motivation:

ChannelMatchers#CompositeMatcher inverts matches result.

Modifications:

Switched return values.

Result:

ChannelMatchers#CompositeMatcher will return correct results.
[#2525] Use VoidChannelPromise in MessageToMessageEncoder when possible

Motivation:
At the moment MessageToMessageEncoder uses ctx.write(msg) when have more then one message was produced. This may produce more GC pressure then necessary as when the original ChannelPromise is a VoidChannelPromise we can safely also use one when write messages.

Modifications:
Use VoidChannelPromise when the original ChannelPromise was of this type

Result:
Less object creation and GC pressure
Make ChannelOutboundBuffer abstract and move impl to DefaultChannelOutboundBuffer
Store the ChannelPromise in an extra circular buffer
Factor out stuff for NioSocketChannelOutboundBuffer
Use ChannelFlushPromiseNotifier for ChannelPromises