DirectoryLayer: ExistsAsync(), TryRemoveAsync() / RemoveAsync(), deny removing the root directory

- ExistsAsync() return true if a directory exists, otherwise false
- TryRemoveAsync() return false if not found
- RemoveAsync() throws if not found
- Attempting to open/move/remove the root directory will throw an InvalidOperationException
- cleaned up the code, fixed a few typos