asyncIterate = iterable => {
  let iterator;
  if (iterable[Symbol.asyncIterator]) {
    iterator = iterable[Symbol.asyncIterator]();
  } else if (iterable[Symbol.iterator]) {
    iterator = iterable[Symbol.iterator]();
  } else if ('next' in iterable) {
    iterator = iterable;
  }
  return iterator;
}
Returns the iterator for the given iterable object.
Supports both synchronous and asynchronous iterables.

@template T The item type of the iterable.
@param {SomehowAsyncIterable<T>} iterable The iterable object.
@returns {Reader<T>} sort of fudging this into a stream to appease "mapReader"