Improve enumerator performance

Performance on micro benchmark shows ~1.5x speed improvement on my
machine.

- Rip out naive unfold. Naive because it wraps every call to the Result
  set iterator with `Future.apply` for no reason.
- Check for availability of already paged-in results. If present, the
  call to `next` will not block, so no need to send it to the thread
  pool.
- Pre-fetch rows to avoid blocking more than we need to. The next set
  can always be paged in once a threshold is passed. Set to 100
  currently, but this could be tuned.