Implement compression of objects before they are saved into the storage provider. Each container type can specify which algorithm to use (currently `none` or `zstd`) and the compression level.
Split the tests into two subdirectories: those that work in pure python and those that use the C++ bindings.