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+.
I agree this code is definitely an improvement over what we had before. I'm still somewhat skeptical about whether thinking of this as a pipeline is the right way to go. I would argue that this code is simpler (though I may be omitting enough of the details that that's not actually true), and even though it doesn't do work in parallel, it probably doesn't need to.
```
iter = getIteratorToBson()
opList = []
for op in iter {
  opList.append(op)
  time = controller.getSleepTime(op)
  if time == 0 {
    continue
  }
  time.Sleep(time)
  applyOps(opList) // actually send the ops
}
```
That all said, I think I'm good with this new version of the code.