FileStorage: extract file handling logic to a FileDeviceHelper object

This will allow code reuse for Gluster through composition, rather
than inheritance.
Add ValidatePortNumber method

This method accepts a port number and checks that it is in fact valid.
Gluster: FIXME: Update design document
Gluster: minimal implementation

Add Gluster to Ganeti by essentially cloning the shared file behaviour
everywhere in the code base.
Gluster: add GlusterVolume class

In order for Ganeti to manage Gluster volumes, Ganeti needs to know
what a Gluster volume is to begin with. This class models one.
Gluster: change mount point location to configure-time value

This commit changes the mount point of Gluster devices to an (almost)
arbitrary place (subject to the restrictions of
_GetForbiddenFileStoragePaths checks.)

This introduces complexity around the entire system of file path
allowance checking in Ganeti, as now the allowed storage paths depend
on the specific disk template in question.
Gluster: automatically un/mount gluster volumes

Allow Ganeti to manage mounts of Gluster volumes autonomously.
Gluster: FIXME: add userspace access support

Add support for the QEMU gluster: protocol
Gluster: add requirements to install.rst
Gluster: announce in NEWS

Add the relevant line to NEWS