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+.
Reasonable points. What about something minor then, like:

```go
// Send the current list of elements as a batch, unless it's empty. Returns whether or not a batch was sent.
sendElements := func() bool {
  if len(elements) == 0 {
    return false
  }
  select {
  case c <- elements:
      elements = elements[:0]
  case <-done:
  }
  return true
}
for {
  select {
  case elem, open := <- ops:
    if !open {
      sendElements()
      return
    }
    elements = append(elements, elem)
  default:
    if !sendElements() {
      time.Sleep(1 * time.Millisecond)
    }
  }
}
```