The start() schedules an interval that enqueues one chunk every 800ms. After 5 chunks the stream
closes by calling controller.close().
Each read() returns a Promise. If no chunk is ready, it waits until the next
enqueue().
This is the pull / backpressure contract.