Rather than hold all the JSON source in memory, as well as the YAML structures
needed to index into it, we parse eagerly into CompileCommand structures, which
simplifies the implementation a lot.
Possibly at the cost of performance/memory usage, need to measure that.
(I'd expect that eager parsing with string deduplication would be fine at least)
Behavior changes:
- rejects noise at end of JSON files (see fixed test), rather than silently accepting
- ignores unknown attributes, rather than rejecting
- when "arguments" is a single-element array, no longer tries to parse it (I guess this was a bug)