This change factors the body of `extract_archive()` into a separate struct named `ExtractorIter` which implements the `Iterator` trait. This refactor has two goals: * Make it easier to provide and propagate errors and additional information via `anyhow::Context` * Introduce a means to handle errors that occur during extraction, with the possibility to continue extraction if the handler decides that the error is not fatal The latter point benefits from the information provided by the former; previously, errors could only be handled in certain locations (e.g. application of metadata), but not on a "per-entry" basis. Since `extract_archive()` was already using a "desugared" version of the iterator pattern to begin with, wrapping its body up in an actual `Iterator` made the most sense, as it didn't require changing the already existing control flow that much. Signed-off-by: Max Carrara <m.carrara@proxmox.com>