s3: MinIO interop tests on committed ListObjectsV2 traces
Follows the monorepo's interop-testing pattern (same layout as the
boto3 generator under ocaml-s3/test/interop/boto3):
- scripts/generate.sh boots a pinned MinIO container, scripts/generate.py
populates a known bucket via boto3 and dumps raw ListObjectsV2 XML
responses (signed via SigV4) to ../traces/.
- traces/list_simple.xml: three objects under a prefix, not truncated.
- traces/list_truncated.xml: same prefix but max-keys=2, which forces
NextContinuationToken — exercises the pagination branch of our
parser end-to-end against real MinIO output.
- test.ml reads the committed XML and verifies the parsed listing
(keys, sizes, next_token). No network or docker needed at test time;
`dune runtest` passes from the traces alone.
Regenerate via `dune build @regen-traces` when MinIO changes response
shapes. Exposes S3.Http.parse_list_response so the test can exercise
the XML codec without a live HTTP round-trip.