Add new transfer implementation for use by the proxy

This has a number of advantages over the existing implementation:
- It does not hold a buffer unless it needs it, which reduces the memory footprint when dealing with a large number of connections
- It does not suspend reads until the buffer is full