Merge pull request #10 from ajbeamon/master

FdbKeyRange.StartsWith and FdbKeyRange.PrefixedBy both throw exceptions when passed a prefix that contains only zero or more \xFF bytes.
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
Vector bound check bug has been fixed in python's layer
Tweaks to the DirectoryLayer

- added some documentation
- don't fail with nullref when removing empty parent
- testing some new extensions methods...
Fixed the flow of FdbAsyncMode with async operators

- Where/Filters should replace Head with Iterator because they can read more from the db to output one result
- Ensure that all foreach(...) type operators pass in All mode
- Some methods where not flowing the mode to the source
LINQ2FDB: ToEnumerable() should be on FdbAsyncSequenceQuery<T> and use the mode All
Renamed FdbTuple.FromArray/FromEnumerable to FdbTuple.CreateRange

- Using the same naming conventions as the the Microsoft.BCL.Immutable library for creating tuples from collections
- CreateRange(...) will now COPY the array / collection
- Added CreateRange<T>(...) that helps converting T[] into object[] arrays
- Wrap(..) can be used to wrap existing arrays but they are DANGEROUS
Cleaned up the Counter layer

- Flow the CancellationTokens
- Do not run multiple coalesce at the same time, it can only lead to conflicts
- lock the Random instance because it is not thread-safe
- moved the @transactional methods into a static extension class
- added more unit tests