This is what shinychat::chat_append() consumes directly, because
shinychat's whole extensibility contract is
inherits(x, "coro_generator_instance"). The generator is asynchronous
rather than synchronous on purpose: shinychat's consumer only yields the
event loop at an await(), so a synchronous generator would drain in one
tick and the reply would appear all at once instead of token by token.
In a plain script this is rarely what you want. An async generator hands a
coro::loop() promises rather than text, so consuming it takes
coro::async() and coro::await_each(); .on_chunk or a get_partial()
loop says the same thing with less ceremony.