---
Add backend async task execution frame work
Internally this uses Celery, though that shouldn't really matter to the end user of this framework. It should only really matter when setting up a new backend.
The user will decorate thier backend tasks with `sepiida.backend.task()`, which also allows some arguments for controlling different aspects of the task execution.
To run the task in the backend, they will call it using the format `<task_name>.delay(args)`. The task can also be executed synconusly using its standard calling format, `<task_name>(args)`.
This also supports retry logic. For more details on that, see Celery documentation.
`sepiida.backend.create` is used to create the backend application. Somewhat counterintuitivly, this needs to be created as part of both backend AND frontend startup. This is because the frontend needs to know about the backend app to be able to delay tasks in the first place.
Finally this also includes a test fixture for testing backend tasks. The `backend_app` fixture should be used to test backend tasks. It creates a special backend app using the `testing` flag to put the backend into a sycronous mode, where as soon as a `task.delay` method is called, it will be executed imidately, instead of having to have a separate backend processes running. Examples of task tests can be found in tests/test_backend.py