[SPARK-3453] [WIP] Refactor Netty module to use BlockTransferService interface

Issues addressed in this pull request:
- SPARK-3453: Refactor Netty module to use BlockTransferService interface
- 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

Also includes some partial support for uploading blocks. Will finish this and then remove the WIP tag.

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


Thanks to @normanmaurer who reviewed the code offline with me ...
This  handler might be time consuming? thus might also need to be run in separate thread pool other than shared IO pool?