Fix CSHARP-637: Fluent Lambda Expressions Don't Resolve Interfaces

    Accidental regression from https://github.com/mongodb/mongo-csharp-driver/commit/5a62ca86fba984803e445a1d182bc125a56c7714 caused generic interface member mappings to throw.

    Update - added code to handle non-trivial edge case of explicit interface implementations caught during code review of JIRA-637 and rebased off of latest master changes.
minor code reformatting.
code review comments.
Add .Explain() extension method to IQueryable<T> to explain Linq queries.

The extension method operates on IQueryable<T> and can therefore not operate
on .Max, Min, First, Last or any methods that return a scalar. It can also
not operate on .Distinct queries since they call a specific method on the
collection and don't give us access to any cursor.
Added .WithIndex method to Linq queries for index hinting.

.WithIndex can take a string or a BsonDocument as an index hint.
It's an extension method on IQueryable<T> and returns IQueryable<T>.
Example:

var results = _collection.AsQueryable<T>.WithIndex("foo").Where(x=>x.Name == 1).ToList()
CSHARP-667, CSHARP-668: added Explain and WithIndex extension methods.