[SPARK-3019] Pluggable block transfer interface (BlockTransferService)

This pull request creates a new BlockTransferService interface for block fetch/upload and refactors the existing ConnectionManager to implement BlockTransferService (NioBlockTransferService).

Most of the changes are simply moving code around. The main class to inspect is ShuffleBlockFetcherIterator.

Review guide: 
- Most of the ConnectionManager code is now in network.cm package
- ManagedBuffer is a new buffer abstraction backed by several different implementations (file segment, nio ByteBuffer, Netty ByteBuf)
- BlockTransferService is the main internal interface introduced in this PR
- NioBlockTransferService implements BlockTransferService and replaces the old BlockManagerWorker
- ShuffleBlockFetcherIterator replaces the told BlockFetcherIterator to use the new interface

TODOs that should be part of this PR:
- [x] Bring this up to date with master
- [ ] Look at the removed unit tests and see if they still make sense to be added back

TODOs that should be separate PRs:
- [ ] Implement NettyBlockTransferService
- [ ] Finalize the API/semantics for ManagedBuffer.release()



We can have it in init or the SparkEnv way (which is not ideal since I want to minimize dependency on SparkEnv). We can worry about that in my next PR.