Change: Redesign backend error handling to improve reliability

Restic now downloads pack files in large chunks instead of using a streaming
download. This prevents failures due to interrupted streams. The `restore`
command now also retries downloading individual blobs that could not be
retrieved.

HTTP requests that are stuck for more than two minutes while uploading or
downloading are now forcibly interrupted. This ensures that stuck requests are
retried after a short timeout.

Attempts to access a missing or truncated file will no longer be retried. This
avoids unnecessary retries in those cases. All other backend requests are
retried for up to 15 minutes. This ensures that temporarily interrupted network
connections can be tolerated.

If a download yields a corrupt file or blob, then the download will be retried
once.

Most parts of the new backend error handling can temporarily be disabled by
setting the environment variable `RESTIC_FEATURES=backend-error-redesign=false`.
Note that this feature flag will be removed in the next minor restic version.

https://github.com/restic/restic/issues/4627
https://github.com/restic/restic/issues/4193
https://github.com/restic/restic/pull/4605
https://github.com/restic/restic/pull/4792
https://github.com/restic/restic/issues/4515
https://github.com/restic/restic/issues/1523
https://github.com/restic/restic/pull/4520
https://github.com/restic/restic/pull/4800
https://github.com/restic/restic/pull/4784
https://github.com/restic/restic/pull/4844
