async reconnect () {
    this._isReconnecting = true

    if (this._ws !== null && this._isOpen) { // did we get a watchdog timeout and need to close the connection?
      await this.close()

      return new Promise((resolve) => {
        this.once(this._authOnReconnect ? 'auth' : 'open', resolve)
      })
    }

    return this.reconnectAfterClose() // we are already closed, so reopen and re-auth
  }
Utility method to close & re-open the ws connection. Re-authenticates if
previously authenticated

@returns {Promise} p - resolves on completion