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: Update design document

Anticipate and explain the choices made in the Gluster patch series.
Remove parts about a possible way of supporting userspace access as
it has been implemented otherwise.
Gluster: minimal implementation

Add Gluster to Ganeti by essentially cloning the shared file behaviour
everywhere in the code base.
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: add userspace access support

Add support for the QEMU gluster: protocol
Gluster: implement getDefaultStorageKey

Adds Gluster specific code for getDefaultStorageKey
Gluster: add the Shared File storage type.

The shared file and gluster disk templates should not report their disk
space information like file does, because they do not behave the same.

If a cluster pulls from the same, shared source of storage then it is
not correct, or useful, to report per-node disk availability, as the
information is not node-specific.

This change introduces the Shared File storage type for which no
per-node measuring of disk resources is made.
Gluster: announce in NEWS

Add the relevant line to NEWS