BETWEEN, a more mature approach

This is a work in progress.

`RANGE` is now compiled to construct an array of values.

`Between` is now handled as follows in the planner phases:
1. an `ExprOp` is constructed, but not yet used (not the correct one yet; there will be some work to represent all the expressions we support as exprOps, but I believe everything is in place to do this work). This expression will eventually be used to translate portions of the expression to JS for use with `$where`.
2. a `Selector.And` instance is constructed which is actually used.
3. the pipeline phase has a case for `Between` so as not to fail, but does nothing interesting with it. Not sure what we actually need there, if anything.
You should create `BsonField.Index` here, not `BsonField.Name`. Even though MongoDB treats them the same we want to preserve the distinction as long as possible. Also the only difference between these two lines of code is the constructor and the exact type of the `BsonField, so you could extract out the duplication with a simpler helper function, something like:

```
def buildProject[A <: BsonField.Leaf](parent: Option[BsonField], child: A) = 
  emit(parent match {
    case \/- (Some(parent)) => parent \ child
    case \/- (None) => child
  })
```

Then they become something like, `buildProject(objAttrOpt, BsonField.Name(fieldName))`, etc.