* Lint with pre-commit
* Move existing tox qa hooks into pre-commit.
* Set up GitHub Action based on https://github.com/pre-commit/action/ (we could also use https://pre-commit.ci ).
* Add `pyupgrade` to drop old Python syntax.
* Add `flake8-bugbear` plugin to prevent flake8 errors.
* Drop custom GHA
As of [bpo-32528](https://bugs.python.org/issue32528), asyncio.CancelledError is
not a subclass of concurrent.futures.CancelledError. This means that if an
asyncio future raises an exception, it won't be caught. Therefore, the
exception will bubble past the try-except within the loop in application_checker,
resulting in done applications not being cleaned up, and the application_checker
task not being queued again.
As per https://github.com/django/asgiref/pull/92
Required valid URI path fragments to be used in tests:
- Test case must ensure paths are correctly quoted before calling
run_daphne_request() & co.
Co-authored-by: Carlton Gibson <carlton.gibson@noumenal.es>