text: Title: Server throws sanic.exceptions.ServerError after disconected.
  Body: ## Summary
  
  The following exception was thrown after client close connection.
  
  It only takes place while async_mode = 'sanic'.
  
  ```
  [2021-06-17 12:27:20 +0800] [21364] [ERROR] Exception occurred while handling uri: 'ws://localhost:63047/socket.io/?transport=websocket&EIO=4&t=1623904035.5453622'
  Traceback (most recent call last):
    File "C:\Users\virus\.pyenv\pyenv-win\versions\3.9.4\lib\site-packages\sanic\app.py", line 737, in handle_request
      handler.is_websocket  # type: ignore
  AttributeError: 'function' object has no attribute 'is_websocket'
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "C:\Users\virus\.pyenv\pyenv-win\versions\3.9.4\lib\site-packages\sanic\app.py", line 739, in handle_request
      raise ServerError(
  sanic.exceptions.ServerError: Invalid response type None (need HTTPResponse)
  ```
  
  ## How to reproduce
  
  Run **server.py** and **client.py.**
  
  Script **client.py** emits 3 event than close connection.
  
  ```sh
  python server.py sanic
  python client.py
  ```
  
  **server.py**
  ```python
  '''
  Socket.IO server for testing
  
  CLI:
    python -m watchgod server.main [aiohttp|sanic|tornado|asgi]
  
  Test results:
             | connect | disconnect | event | Ctrl+C
    ---------+---------+------------+-------+--------
     aiohttp |    O    |     O      |   O   |   O
     sanic   |    O    |     X      |   O   |   O
     torando |    O    |     O      |   O   |   X
     asgi    |    X    |     ?      |   ?   |   O
  '''
  
  import sys
  
  import socketio
  import tornado.ioloop
  import tornado.web
  import uvicorn
  
  from aiohttp import web
  from sanic import Sanic
  
  PORT = 63047
  count = 0
  
  if len(sys.argv) >= 2 and sys.argv[1] in ['aiohttp', 'sanic', 'tornado', 'asgi']:
      ASYNC_MODE = sys.argv[1]
  else:
      ASYNC_MODE = 'aiohttp'
  
  if ASYNC_MODE == 'sanic':
      sio = socketio.AsyncServer(async_mode=ASYNC_MODE, cors_allowed_origins=[])
  else:
      sio = socketio.AsyncServer(async_mode=ASYNC_MODE)
  
  if ASYNC_MODE == 'aiohttp':
      app = web.Application()
  if ASYNC_MODE == 'sanic':
      app = Sanic(name='Just a simple service')
      app.config['CORS_SUPPORTS_CREDENTIALS'] = True
  if ASYNC_MODE == 'tornado':
      app = tornado.web.Application([
          (r"/socket.io/", socketio.get_tornado_handler(sio))
      ])
  if ASYNC_MODE == 'asgi':
      app = socketio.ASGIApp(sio)
  
  @sio.event
  async def connect(sid, environ, auth):
      print('[%s]: connected' % sid)
  
  @sio.event
  async def disconnect(sid):
      print('[%s]: disconnected' % sid)
  
  @sio.event
  async def client_said(sid, data):
      global count
      message = 'This is server response #%d.' % count
      count += 1
      print('[%s]: %s' % (sid, data['message']))
      await sio.emit('server_said', { 'message': message })
  
  def main():
      print('==============================')
      print('  async_mode = %s' % ASYNC_MODE)
      print('==============================')
      if ASYNC_MODE == 'aiohttp':
          sio.attach(app)
          web.run_app(app, port=PORT)
      if ASYNC_MODE == 'tornado':
          app.listen(PORT)
          tornado.ioloop.IOLoop.current().start()
      if ASYNC_MODE == 'sanic':
          sio.attach(app)
          app.run(port=PORT)
      if ASYNC_MODE == 'asgi':
          uvicorn.run("server:app", host="127.0.0.1", port=PORT, log_level="info")
  
  if __name__ == '__main__':
      main()
  ```
  
  **client.py**
  ```python
  '''
  Socket.IO client for testing
  '''
  
  import asyncio
  import socketio
  
  COUNT_LIMIT = 3
  
  count = 0
  sio = socketio.AsyncClient()
  
  @sio.event
  async def connect():
      print('[server]: connected')
      await sio.emit('client_said', { 'message': 'Hello' })
  
  @sio.event
  async def server_said(data):
      global count
      print('[server]: %s' % data['message'])
      if count < COUNT_LIMIT:
          message = 'This is client message #%d.' % count
          print('    [me]: %s' % message)
          count += 1
          await sio.sleep(1)
          await sio.emit('client_said', { 'message': message })
      else:
          await sio.disconnect()
  
  @sio.event
  async def disconnect():
      print('[server]: disconnected')
  
  async def main():
      await sio.connect('ws://localhost:63047', transports=['websocket'])
      await sio.wait()
  
  if __name__ == '__main__':
      asyncio.run(main())
  ```
  
  ### Results
  
  Stdout of server.py
  
  ```
  ==============================
    async_mode = sanic
  ==============================
  [2021-06-17 12:27:07 +0800] [21364] [INFO] Goin' Fast @ http://127.0.0.1:63047
  [2021-06-17 12:27:07 +0800] [21364] [INFO] Starting worker [21364]
  [XHATfMUUXqrVvgjzAAAB]: connected
  [XHATfMUUXqrVvgjzAAAB]: Hello
  [XHATfMUUXqrVvgjzAAAB]: This is client message #0.
  [XHATfMUUXqrVvgjzAAAB]: This is client message #1.
  [XHATfMUUXqrVvgjzAAAB]: This is client message #2.
  [XHATfMUUXqrVvgjzAAAB]: disconnected
  [2021-06-17 12:27:20 +0800] [21364] [ERROR] Exception occurred while handling uri: 'ws://localhost:63047/socket.io/?transport=websocket&EIO=4&t=1623904035.5453622'
  Traceback (most recent call last):
    File "C:\Users\virus\.pyenv\pyenv-win\versions\3.9.4\lib\site-packages\sanic\app.py", line 737, in handle_request
      handler.is_websocket  # type: ignore
  AttributeError: 'function' object has no attribute 'is_websocket'
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "C:\Users\virus\.pyenv\pyenv-win\versions\3.9.4\lib\site-packages\sanic\app.py", line 739, in handle_request
      raise ServerError(
  sanic.exceptions.ServerError: Invalid response type None (need HTTPResponse)
  [2021-06-17 12:27:20 +0800] - (sanic.access)[INFO][127.0.0.1:5318]: GET ws://localhost:63047/socket.io/?transport=websocket&EIO=4&t=1623904035.5453622  500 707
  ```
  
  Stdout of client.py
  
  ```
  [server]: connected
  [server]: This is server response #0.
      [me]: This is client message #0.
  [server]: This is server response #1.
      [me]: This is client message #1.
  [server]: This is server response #2.
      [me]: This is client message #2.
  [server]: This is server response #3.
  [server]: disconnected
  ```
  
  ### Environment
  
  * Windows 10 Home 19041.1052
  * Python 3.9.4 x64
  * sanic 21.3.4
  * python-socketio 5.3.0
  * websocket-client 1.1.0
  