[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 (CMBlockTransferService).

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
- CMBlockTransferService 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()



toNetty actually applies to all managed buffers. We can move this into the netty package, but in that case we lose the compile time check because somebody could add a new implementation of the ManagedBuffer and forget to update the netty part of the code. 

That said, I will add some inline doc to explain the purpose of this.