Implement archiver/extractor interface
Implement a solution to easily replace and implement new Archivers/Extractors. GitLab supports
raw, but the code to do so isn't built around any common interface. Replacing an archiver or extractor requires modifying an awful lot of code.
There should be a way to register an Archiver/Extractor for a specific format and the rest of the codebase not notice.
Introduce an API for the registration of Archivers and Extractor using common interfaces. The first Archivers and Extractors implemented will be shims that bridge with the existing archiving and extraction code. We change the entry points into archiving/extraction to use the new interfaces, but the shim returns to the existing implementation. This reduces how many tests would need to be modified, and allows us to continue using the legacy implementations until they can be entirely removed.
We don't introduce any new Archivers/Extractors in this step, we only introduce the new API we can use in the future. We don't feature flag this. We need this interface to more easily feature flag different Archivers/Extractors in the future. This should be a relatively safe change, as there will be few lines of code modified.
The API introduces changing the compression level in a generic way (Fastest, Fast, Default, Slow, Slowest). This will be used in the future.