Per @jklontz's suggestion, replace the look-ahead scheme with a sentinel

Instead of maintaining a lookahead buffer so that the last frame number
can be known before processing it, just push an empty FrameData through
the stream when the DataSource breaks.