Split JsonFile into JsonStreamFile and JsonWholeFile

These differ in how they parse an exported JSON file: JsonStreamFile
will use a streaming parser to prevent having to parse the whole file
into memory at once.

At the same time, we add tests around the 'read' functionality of files,
and change the contract to be readObject() rather than readObjects() (to
support streaming formats)