Refactor replay

Refactor the replay package.  This change breaks the replay into well separated pipeline stages, namely:

[parse BSON] ---op---> [controlRate] ---op---> [batchOps] ---[]op---> [applyOps]

Each stage controls the lifetime of their own output channels, closing them when appropriate.  Each stage also properly exits early in the case of failure.  The design of the new package is influenced heavily by [this blog post on pipelines](http://blog.golang.org/pipelines)
This update also makes oplog-replay compatible with go 1.3+.
Yeah, I also dislike this code, but didn't see a clear way around it.  I specifically moved the len() check to this stage instead of the following stage because I think it makes more sense logically for each stage to be self-contained.  In my mind, an empty batch breaks the contract that this stage returns batches of queries.

As for checking for done, if it were done before pulling from ops there would be a race condition where we could get an op, but have no receiver and block on putting into the output channel indefinitely.

I can (and probably should) pull the select.... code into a separate function, but it doesn't save us that much.  I would also pull in the if, but I need to do the else in the default case.  Well...I don't need to, but if I don't then this goroutine eats tons of cpu in busy wait.