Early abort for forEach, peek multiple

Adds the capability to peek at multiple entries at the head of the
queue. I didn't have to change QueueFile, as its forEach already can
avoid reading bytes, but this optimization to abort early saves some
object creation.

Not a breaking API change.
The idea was to be able to re-use the existing functionality with a unified type. But if it's going to go the other way (wrap and delegate) then it can just be another interface.