Added IFdbKey interface that contains ToFoundationDbKey() method

- Similar to the as_foundationdb_key in python
- Implemented (explicitly) by FdbSubspace and IFdbTuple for now
Refactored FdbRangeChunk: added Reversed, Count, IsEmpty, First and Last property

- Reversed is set to true if the original range read was reversed
- Count, IsEmpty, First and Last are helpers to prevent people from doing things like ".Chunk[0]" (chunk may be null, or it may be empty)
The CancellationToken is always required for GetAndWatch / SetAndWatch
Added a few extensions methods that take IFdbKey as keys (instead of Slices)

- Removed most extensions methods on IFdbTuple because it is also an IFdbKey
Renamed 'Slicer' struct into 'SliceReader'
Put the test data inside sub-directories
Started work on the type system / type codecs [Work in Progress]

- Renamed ISliceSerializer<T> into IFdbValueEncoder<T> (name will probably change again), should only be used for Values (unordered, or order not specified))
- FdbTupleSerializer<T> implements IFdbValueEncoder<T> and is used as the default encoder in most Layers (queue, vector, array, ...)
- IFdb(xxx)KeyEncoder<T> are supposed to be used for keys (either standalone, or composite)
- Added FdbTuple.UnpackNext<T> that is used to consume a single item from the head of a slice, using the tuple format
- Indexes are BROKEN!!
Refactored slice writers and serializers

- Renamed FdbBufferWriter to SliceWriter and changed into a struct
- Renamed FdbSliceSerializer to FdbValueEncoder
- Added a rough prototype of a Type System and Type Codecs (work in progress)
fix Slice.SameBytes when two slices share same buffer with different offset but with same content