IO: Added DFS metadata handler

> [EZP-23437](http://jira.ez.no/browse/EZP-23437)
> Specs: [doc/specifications/io/legacy_dfs_cluster.md](https://github.com/ezsystems/ezpublish-kernel/blob/EZP-23437-dfs_io_handler/doc/specifications/io/legacy_dfs_cluster.md)
Adds a `legacy_dfs_cluster` metadata handler.

Reads and writes metadata to MySQL using doctrine, from the legacy `ezdfsfile` table.
An event listener can serve files from NFS like `index_cluster.php` did with legacy.

## Configuration

```yaml
ezpublish:
    system:
        default:
            io:
                metadata_handler: cluster
                binarydata_handler: nfs

ez_io:
    metadata_handlers:
        # Add a metadata handler named 'cluster'...
        cluster:
            # ...of type legacy_dfs_cluster...
            legacy_dfs_cluster:
                # ...that uses the doctrine 'connection doctrine.dbal.default_connection'.
                connection: doctrine.dbal.default_connection
    binarydatadata_handlers:
        # Add a binarydata handler named 'nfs'...
        nfs:
            # ...of type flysystem...
            flysystem:
                # ... that uses the flysystem adapter named 'nfs_adapter'.
                adapter: nfs_adapter

oneup_flysystem:
    adapters:
        nfs_adapter:
            local:
                directory: /mnt/nfs/ezpublish
```

## Legacy compatibility
This will work with legacy configured with the DFS file handler, and the NFS mount point on `/mnt/nfs/ezpublish`.

## Cloud storage support
The S3 flysystem driver can be used instead of local. However, in order to be compatible with legacy, 
 [ezsystems/ezdfs-fsbackend-aws-s3](ezsystems/ezdfs-fsbackend-aws-s3) must be used to store ALL files (not just images or binaries).

## TODO
- [x] Rewrite rules (see ezsystems/ezpublish-community#194)