[WIP] [SPARK-2468] Netty based block server / client module

This is a rough draft, but it can't be much worse than the old Netty module since the old one didn't really work :)

Compared with the old Netty module, this one features:
- It appears to work :) The old one didn't have a frame decoder and only worked for blocks with very small size
- Basically a rewrite of the old Netty module, which was introduced about 1.5 years ago but turned off by default
- SPARK-2941: option to specicy nio vs oio vs epoll for channel/transport. By default epoll is used on Linux, and nio is used on other platforms
- SPARK-2943: options to specify send buf and receive buf for users who want to do hyper tuning
- SPARK-2942: io errors are reported from server to client (the protocol uses negative length to indicate error)
- SPARK-2940: fetching multiple blocks in a single request to reduce syscalls
- SPARK-2959: clients share a single thread pool
- SPARK-2990: use PooledByteBufAllocator to reduce GC (basically a Netty managed pool of buffers with jmalloc)

Compared with the existing communication manager, this one features:
- IMO it is substantially easier to understand
- Should create much less garbage because of SPARK-2990 (PooledByteBufAllocator)
- don't quote me on this, but I think a lot less sys calls
- zero-copy send for the server for on-disk blocks
- one-copy receive (due to a frame decoder)

TODOs before it can fully replace the existing ConnectionManager, if that will ever happen (most of them can probably be done in separate PRs since this needs to be turned on explicitly)
- [ ] Lots of test cases
- [ ] Performance analysis
- [ ] Support client connection reuse so we don't need to keep opening new connections
- [ ] Support serving non-disk blocks
- [ ] Support SASL authentication


Thanks to @coderplay for peer coding with me on a Sunday.