Improves document filtering for query and update/remove operations.

This implements record filtering that is closer to match the original MongoDB algorithm. The new code is non-trivial, so I would like more eyes on it.
@rodaine @parkr can you please take a look? Please also feel free to suggest/add any other people who could help with the review.

Note, the the old code is completely replaced by the new implementation and the tests are overhauled, too. Thus, for `lib/filter.js` and `test/testFilterItems.js` it makes sense to look at just the new version rather than at the diff. Thanks!
`mongoose.Types.ObjectId.isValid` will return true on 24-char hex strings. I want to make sure I am comparing `ObjectID` objects here.  This is to mimic behavior of actual MongoDB, which will not consider an `ObjectID` and its string representation equal.