This adds a test with a failed upload.
The failed upload is done in parallel, so (at least) one of the uploads succeeeds and one upload fails.
The backup then errors, but a subsequent backup continues without errors and creates a synthetic filelist.
Also refactored the DeterministicErrorBackend to not use magic strings.
And made it actually deterministic.
This PR is the final change, where all backends are now purely implemented with async interfaces.
The code changes here replace the LIST call with an async version. This affect all backends (and then some) but the changes are mostly mechanical rewrites of the code.
In many places, the backeds were already prepared for async output, in other some glue was needed.
To reduce the scope of this change, some backends simply report a synchronous result as an async list.