Read data from the read end of a pipe using read(2) system call.
For pipe.read(buf, offset~, max_len~),
at most max_len bytes of data will be written to buf, starting from offset.
The number of read bytes will be returned.
At most one task can read from a pipe at any time.
To allow multiple reader,
use a worker task for reading and use @async.Queue to distribute the data.