Redesigned the DataSource classes to allow for improved pipelining of
the DataSource execution with the ParserRoutine execution. Results in
better buffering characteristics. Slightly more complex handshaking
between threads - caller needs to check if the data source is "ready
enough" before proceeding with subsequent tasks. Ready enough is
dependent upon the data source, but generally it means that the input
stream is ready to start providing data.