A gRPC data reader that streams a region from gRPC data server.
1. The client sends a read request (id, offset, length).
2. Once the server receives the request, it streams chunks to the client. The streaming pauses
if the server's buffer is full and resumes if the buffer is not full.
3. The client reads chunks from the stream using an iterator.
4. The client can cancel the read request at anytime. The cancel request is ignored by the
server if everything has been sent to channel.
5. To make it simple to handle errors, the channel is closed if any error occurs.