When the a primitive restarts, it closes any pipes it has open (this
is done in the close() method).
As the pipes are closed, they get marked as needing a restart (this
is done automatically).
As subsequent primitives reach the point in the pipe where the
restart was called, the read(..) method returns
end-of-file (EOF), numRead<0, and marks the primitive
for a restart.
These primitives restart and trigger any additional restarts "down
the line." The result is like a waterfall with subsequent primitives
restarting as needed.