FileFormatRoot.
FileFormatRoot takes a list of FileFormats as processing units and
a list of _FileRanges as inputs. It provides an interface to
iterate through all the inputs. All inputs will be processed by each
processing unit in a cascaded manner before being emitted.
The order of the list of FileFormats matters. The last
FileFormat's output is returned by FileFormatRoot.
Each FileFormat asks FileFormatRoot for inputs, which are either outputs
from its previous FileFormat or, in the case of the first FileFormat,
outputs directly from FileFormatRoot.
FileFormats don't know each other. FileFormatRoot coordinates all
their initializations, (de)serialization, and communications.