TLS Server Name Indication(SNI) support (reworked)

This patch added support for SNI detection. Now your Netty server could host multiple certificates and serve client with proper one. 

Usage:

``` java

// application wide
SniHandler.Builder builder = new SniHandler.Builder();

builder.addContext("*.avoscloud.com", sslcontext1)
  .addContext("*.leancloud.cn", sslcontext2)
  .defaultContext(sslcontext1);

// in the ChannelInitializer

pipeline.addLast(builder.build());

```

This handler detects SNI extension, then adds proper SslHandler to the pipeline. 

In Java 8 SNI is supported in JDK, but this handler is going to enable SNI support for all Java versions.

You may check #3020 for previous discussions.
I think `selectedContext` could be null if `defaultContext` is used because there is no null check in the constructor and it is an optional parameter in the builder?