Moves the ingester2 TestContext & builder to its own crate for reuse
between integration tests & benchmarks (and more?!)
This allows us to DRY & reuse the test code with it's nice API for
benchmarks too, without forcing it all to be in the "prod" build of
ingester2 (and the dependencies, and their dependencies, etc).
This also means this code can be built and cached instead of being
rebuilt all the time during normal development.
Adds a ingester e2e test asserting the graceful shutdown behaviour;
specifically that:
* Buffered data is uploaded to object storage
* WAL files are cleaned up and empty (no replay on startup)