Read a FromSoftware `.sl2` save and report what is in it.
The package is layered, and the layers only point one way:
reader / keys bounds-checked reads, the AES keys
bnd4 / crypto / detect the container, per-game decryption, which game
itemdb / progress / roster item tables, the shared progress floor, names
ds1 / ds2 / ds3 / er one module per game family
totals the "of N" denominators (needs every game)
render / jsonout the two writers
convert the driver: parse_save, then either writer
cli argument parsing and main()
`parse_save` does all the reading and `render_markdown` / `build_json` do all the
writing, so the two output formats cannot drift apart — they are the same data.
Everything below is imported for its side effect of being re-exported: the CLI, the
parity harnesses and the scratch tools all reach in through this one name.