Discovery side of an ObjectSource: which keys exist under a prefix.
Kept separate so pure-read consumers that never need discovery (only
get) aren’t forced to implement it. Returned keys are full keys (the
prefix joined with each entry’s name), matching what ObjectSource::get
expects — never bare file names.
Symbols with a per-symbol price file under root/prices, sorted and
de-duplicated. Recognizes .csv.gz, .parquet, and .csv; the loaders
detect the actual format from content.