Added test that verify that read operations on a cluster that does not exist respect the specified Timeout

- note: there is a known bug on GetReadVersionAsync() that does not timeout properly
Fix bug to allow reading the empty key

- Slice.Empty is a valid key in the database (but Slice.Nil is still forbidden)
Directory Layer: make FdbDirectoryPartition throw on any direct attempt to use the partition's key, as is the case in all the other bindings.

- Other bindings prohibit using the root subspace of a Directory Partition and throw for any attempt to use the root subspace
- This may be a breaking change if you were using a root partition directly before. You will need to open a sub directory and use that to read/write keys!
- Changed .Key, Pack(...), Concat(...), Partition(...) and other methods so that they throw an InvalidOperationException when called on a FdbDirectoryPartition
- Refactored FdbSubspace so that most methods call GetPrefixKey(..), and added InternalKey property for method that should never fail
- Fixed a few things