Added a unit test for GetKeyAsync(FdbKeySelector)
Added batch operation GetKeysAsync(FdbKeySelectors[]) that is optimized for resolving multiple selectors

- implementation similar to GetValuesAsync(), using only a single Task<T[]> to track all the futures
Fixed typo
Tweaked the ToString() or ranges and selector pairs
Added TestHelpers.AssertThrowAsync<T>

- Assert.That(await () => ..., Throws.InstanceOf<T>()) does not work in nunit 2.6.2 !
Fixed bug with attempting to create an FdbFutureArray<T> with no handles

- Immediately return a task with new T[0] if that's the case
- Throw if attempt to construct an FdbFutureArray<T> with an empty handle array
- added null checks and fixed some xml comments
Refactored range queries to make them faster for the First/Single/Last/Any/None LINQ operators

- tr.GetRange() still returns an FdbRangeQuery<KeyValuePair<Slice, Slice>> by default
- FdbRangeQuery<T> wraps the lambda to convert from KVP<Slice, Slice> to T
- removed the tr.GetRange(...).Batched() iterators because they do not work well with the new generic types
- most of the [First/Single/Last](OrDefault)Async methods use an optimized path that tries to only read 1 or 2 values from the db
- any range query that use Where(...) will revert to the non-optimized code path
- Updated a few layers to use the new pattern
- Fixed invalid uses of SingleOrDefault instead of FirstOrDefault in the DirectoryLayer