don't use callback API in REPL. fixes part of #4537

The old code assumed that the stdin i/o stream had fields like `closecb`. This fixes that, and simplifies the code to use the task-based API that we prefer.

It feels a bit strange to read only 1 byte at a time, but it's probably ok. As an optimization I believe we could read all available data up to the next newline.