[SPARK-3453] Netty-based BlockTransferService

I tested the new network shuffle code. This network shuffle code can support ~ 1GB/s per node network speed while producing almost no garbage that would trigger gc.

Issues addressed in this pull request:
- SPARK-3453: Refactor Netty module to use BlockTransferService interface
- SPARK-3016: Block upload
- SPARK-3018: Release all buffers upon task completion/failure
- SPARK-3002: Create a connection pool and reuse clients across different threads
- SPARK-3017: Integration tests and unit tests for connection failures
- SPARK-3049: Make sure client doesn't block when server/connection has error(s)
- SPARK-3502: SO_RCVBUF and SO_SNDBUF should be bootstrap childOption, not option
- SPARK-3503: Disable thread local cache in PooledByteBufAllocator

Review guide:
- server/client protocol is defined in protocol.scala
- please look closely at ShuffleBlockFetcherIterator, in particular, parts related to reference counting and cleanup of buffers

Things that should be done in separate PRs:
- SASL security support
- (maybe) use BlockID instead of String for stronger types in block ids

Thanks to @normanmaurer who reviewed the code offline with me.
The comment here suggests that you should only have to retain if your buffer is a NettyManagedBuffer, which isn't quite true, as you could have an NioManagedBuffer whose ByteBuffer underlies a Netty ByteBuf, in which case it is never safe to pass around.

I'm just a little worried about sanitary buffer usage, as misuse of this API from not copying could lead to nondeterministic data corruption.