Refactor shared storage

Since the removal of the Shared folder in oc7 the logic of the shared storage and cache can be greatly simplified.

This replaces the shared storage with a combination of 2 generic storage and cache wrappers
- `\OC\Files\Storage\Wrapper\Jail`: limits all access of the storage to a specific folder
- `\OC\Files\Storage\Wrapper\PermissionsMask`: applies a permissions mask on top of a storage

Together they form 99% of the logic behind a share (a sub directory of storage with limited permissions) and also allow dropping the `ReadOnlyWrapper` previously in place.

Overall this drastically reduces the amount of logic for shared storages which results in a nice performance increase.
On my local test instance this reduces the time needed for a WebDAV upload to a shared folder with ~120ms and drops the number of database queries by 103

TODO:
- [x] Adjust unit tests
- [x] Mount any storage inside a shared folder for the share recipient

cc @DeepDiver1975 @PVince81 @schiesbn 
I have an environment with lots of shares where this fails (maybe broken shares, whatever, need to look into it).
Can you make this more defensive and fail gracefully / log a warning ?
`$root->getById()` returns null in that env.