mocks/jobs: ensure events fire in sequence

The timeouts were unreliable - sometimes the complete event would fire before
the data events all fired. So now we wait for each event to fire before firing
the next one. This also makes it much easier to handle very low timeouts (like
0).