refactor: use error-first callbacks
pool: switch to next available provider on error

  also implement a few more error listeners