Enhancement: Improve pruning performance and make pruning more customizable

The `prune` command is now much faster. This is especially the case for remote
repositories or repositories with not much data to remove.
Also the memory usage of the `prune` command is now reduced.
Restic used to rebuild the index from scratch after pruning. This could lead
to missing packs in the index in some cases for eventually consistent 
backends, like e.g. AWS S3.
This behavior is now changed and the index rebuilding uses the information
already known by `prune`.

By default, the `prune` command no longer removes all unused data. This
behavior can be fine-tuned by new options, like the acceptable amount of unused space or
the maximum size of data to reorganize. For more details, see
https://restic.readthedocs.io/en/stable/060_forget.html

Moreover, `prune` now accepts the `--dry-run` option and `forget --dry-run --prune`
also shows what `prune` would do.

Fixes several open issues, e.g.:
https://github.com/restic/restic/issues/1140
https://github.com/restic/restic/issues/1599
https://github.com/restic/restic/issues/1985
https://github.com/restic/restic/issues/2112
https://github.com/restic/restic/issues/2227
https://github.com/restic/restic/issues/2305

https://github.com/restic/restic/pull/2718
https://github.com/restic/restic/pull/2842