stream: Change recursive _read() to a loop for sync callbacks