Refactored async enumerables to be able to specify the intent of the caller (iterating, ToList(), FirstOrDefault()) using the FdbAsyncMode enum

- split IFdbAsyncEnumerable<T> into a "generic" IAsyncEnumerable<T> with a default GetEnumerator() method
- Added a GetEnumerator(FdbAsyncMode) that allows to specify the intent of the code that will use the iterator
- Changed the RangeQuery to be in Iterator mode by default, but the mode is overriden by ToList(), SingleOrDefault(), ForEach() and so on.
- Moved the IAsyncEnumerable/tor<T> into the FoundactionDB.Async namespace
Refactored FdbTuple.BatchPack, added FdbKey.Merge

- FdbKey.Merge will add a prefix to a list of keys
- FdbTuple.BatchPack will call Merge under the hood.
Added a better ToString() for key selectors

- from the offset, decide if it is a "firstGreaterXXX" or a "LastLessXXX"
- use "fGT(..)", "fGE(...)" shortcuts for FirstGreaterThan, FirstGreaterOrEqual, ...
- if offset is not 0 or 1, add a "+N" or "-N" at the end
- Use the "[....., .....)" notation for selector pairs (were the end is not included)
Added FdbSubspace.Key getter to be more in line with the Subspace paython layer, removed the ctor that takes a string.
Refactored Subspace (to be closer to the pyton layer equivalent)

- Concat should be used when "appending" tuples where the intent is to append the ITEMS (and not the tuple itself).
- Pack/Append should not be called with a tuple, because it is not possible to insert a tuple as an item inside another tuple.
- If someone really wants to embed a tuple inside another one, he can use "subspace.Append(tuple.ToSlice())"
Added FdbKeyRange.StartsWith(prefix)
Fixed incorrect use of Pack(...)
Fixed FdbTable unit test
Added Slice.ToByte() helper

- Same as slice[0] but will throw if slice count is greater than 1
Changed subspace.Unpack helpers to return null tuple if key is equal to Slice.Nil

- simplifies null checking when dealing with the result of tr.GetAsync(...) or range.FirstOrDefault()/SingleOrDefault()
Added prototype of "alias" values in tuples (\xFF, \xFE)

- The values of enum FdbTupleAlias are serialized as binary
- Allows to express binary prefix "\xFE" of Directory Layer as an element of the tuple itself
- Simplifies adding \0 of \xFF to tuples (to create ranges) by doing tuple.Pack(FdbTupleAlias.Zero) or tuple.Pack(FdbTupleAlias.System)
- Allows for a better ToString() of the keys generated by tuple.ToRange()
Added "NoneAsync()" linq method that is the inverse of AnyAsync()

- GetRange(....).NoneAsync() is optimized to automatically use Limit=1
Tweaked Slice.ToAsciiOrHexaString()
Initial port of the Directory Layer from python
added : convert short to long
added : FdbSubspace.Concat from ITupleFormattable
fix Slice to ArraySegment<byte> convertion if slice is Nil
Added FdbTable.Clear(key)
Added methods on FdbDirectorySubspace to create/open/delete/move
lock the Random instance because rnd.Next() is not thread-safe