[#2709] Change ChannelOutboundBuffer to interface

Motivation:

We expose ChannelOuboundBuffer in Channel.Unsafe but make it impossible to create one instance without the usage of AbstractChannel. This makes it impossible to write a Channel implementation that not extends AbstractChannel.

Modifications:

Make ChannelOutboundBuffer an interface and add DefaultChannelOutboundBuffer which is used by AbstractChannel.

Result:

It's possible to write a Channel implementation which not extend AbstractChannel.
If this is not public, a user who extends `AbstractChannel` (and consequently `AbstractUnsafe`) will not be able to access the return value of `AbstractUnsafe.outboundBuffer()`.