Remove Channel.id completely / Use 64-bit hashCode internally to reduce the chance of collision in compareTo()
Prettier web socket log messages
[#1534] Fix handling of partial frames in SslHandler

* Let SslHandler not extend ByteToMessageDecoder
Remove MessageList from public API and change ChannelInbound/OutboundHandler accordingly

I must admit MesageList was pain in the ass.  Instead of forcing a
handler always loop over the list of messages, this commit splits
messageReceived(ctx, list) into two event handlers:

- messageReceived(ctx, msg)
- mmessageReceivedLast(ctx)

When Netty reads one or more messages, messageReceived(ctx, msg) event
is triggered for each message.  Once the current read operation is
finished, messageReceivedLast() is triggered to tell the handler that
the last messageReceived() was the last message in the current batch.

Similarly, for outbound, write(ctx, list) has been split into two:

- write(ctx, msg)
- flush(ctx, promise)

Instead of writing a list of message with a promise, a user is now
supposed to call write(msg) multiple times and then call flush() to
actually flush the buffered messages.

Please note that write() doesn't have a promise with it.  You must call
flush() to get notified on completion. (or you can use writeAndFlush())

Other changes:

- Because MessageList is completely hidden, codec framework uses
  List<Object> instead of MessageList as an output parameter.
[#1534] Fix handling of partial frames in SslHandler

* Let SslHandler not extend ByteToMessageDecoder
Remove channelReadSuspended / Rename messageReceived(Last) to channelRead(Complete)

- Remove channelReadSuspended because it's actually same with messageReceivedLast
- Rename messageReceived to channelRead
- Rename messageReceivedLast to channelReadComplete

We renamed messageReceivedLast to channelReadComplete because it
reflects what it really is for.  Also, we renamed messageReceived to
channelRead for consistency in method names.
Simplify the exception handling of ChannelOutboundHandler.write()

DefaultChannelHandlerContext does not trigger exceptionCaught() immediately when ChannelOutboundHandler.write() raises an exception.  It just records the exception until flush() is triggered.  On invokeFlush(), if there's any exception recorded, DefaultChannelHandlerContext will fail the promise without calling ChannelOutboundHandler.flush().  If more than one exception were raised, only the first exception is used as the cause of the failure and the others will be logged at warn level.
Fixed ClassCastException in setting min,max sctp streams
Minor refactoring in variable naming in sctp stream config
Revert "Minor refactoring in variable naming in sctp stream config"

This reverts commit e062f7f6f9ee9d64980a0e71947b3477d96e022d.
Revert "Fixed ClassCastException in setting min,max sctp streams"

This reverts commit 276d619afbe47667c7cc552aee652a1f385fd1ad.
Correctly handle forward of remaining data on removal
Rename CodecOutput to RecyclableArrayList and move it to internal package.

* Also reuse it in SslHandler
Adjust ChannelGroup to behave the same like a Channel in terms of write and flush
Allow per-write promises and disallow promises on flush()

- write() now accepts a ChannelPromise and returns ChannelFuture as most
  users expected.  It makes the user's life much easier because it is
  now much easier to get notified when a specific message has been
  written.
- flush() does not create a ChannelPromise nor returns ChannelFuture.
  It is now similar to what read() looks like.
Fix a bug in ChannelOutboundBuffer.addFlush()

It should not advance the tail if no write() was issued so far.
Fix potential leak in HttpContentEncoder
[#1545] Fix ClassCastException by using the correct type for SCTP_INIT_MAXSTREAMS
[#1553] Improve performance of encodeInitialLine
HttpContentEncoder should not remove Content-Length when acting as a passthrough.