I'm not entirely sure of the implementation, but Observables should lend themselves to being async iterable:
// resolves on each value emitted
for await (const value of obs$) {
// iterator closes when observable ends
}
// throw on error?
Would this be useful to implement?