Allow specification of size param in GB/MB/MiB/GiB

It is very impractical to expect folk to specify a disk size
in bytes, when it is far more commonplace to specify them in GB/MB/etc.

Disks are usually treated as 1MB = 10^6 bytes rather than 2^20, so use
this convention but also allow for 'MiB' and 'GiB' to correctly specify
2^20 and 2^30 respectively.

Continue to support bytes being supplied as a string or an Integer.

Raise an ArgumentError if we cannot parse the input string.
Allow attaching independent disks to a VM
Basic Vm#attach_independent_disk integration test

At present there is no way of telling that an independent disk has been
attached to a VM successfully.

For now, assume that the attach_independent_disks method returning true is
enough of a measure of success (which at least covers the case where Fog
raises an exception, or the process_task call fails).

In a later commit, a method of establishing the vms that a disk is attached to
will be added, and this test improved.

UPDATE: Noticed later on that get_vapp(vm_id) does in fact report that independent
        disks are attached. A RASD OVF disk item will be present containing a
        ':vcloud_disk' key, with the link to the disk as its value.
Add Vapp.get_by_child_vm_id constructor

At present, to create a Vm object you must also supply the parent
vApp object. This is technically unneccessary, since the vm retrieved
from the API knows this calready.

In the interests of not changing the interface of the Vm.new method
though, we must provide a way of discovering the parent vApp in order
to create a Vm object from a vm_id reference.

This work was prompted by the need to create a bunch of Vm object
from the output of the 'get_vms_disk_attached_to' Fog method, which
returns a list of Vm ids that a given independent_disk_id is attached
to. I could not return a list of Vm objects without a way to find the
parent Vapp of each.
Add IndependentDisk#attached_vms method

... to allow us to know where a Disk has been attached to, so we can check
that it has been attached correctly!

(NB: There is no way of doing this directly from the get_vm / Vm#vcloud_attributes
call, as we can for local disks)

This is mainly being added so that we can be sure the Vm#attach_independent_disks
test is working more reliably, but it is a useful addition to the IndependentDisk class.
Improve attach disk test; note ordering issue

Improved the VM attach independent disk tests, to check that
the disk was actually flagged as attached to the VM via the
IndependentDisk#attached_vms call.

In the process of this, discovered that the Vm#add_extra_disks method
fails if there are independent disks already attached to the VM. I
strongly suspect that this is due to the way the Fog Model handles
adding local disks rather than it being a limitation of the vCD API itself,
but fixing that is out of scope for this update.

Added a test to document this behaviour and the exception raised by Fog.
Rework size-suffix handling code - tests and name

It is better to test the behaviour of the helper method directly.

Also, since the helper handles integers as well, remove 'string' from the method name.
Do not allow creation of duplicate disks

The vCloud Director API allows you to create a rather nasty situation with
independent disks, as it does not enforce uniqueness on independent disk name
- even when they are in the same vDC. Once duplicate disk names have been created
in the same vDC, it is very difficult to tell them apart.

This commit adds code to IndependentDisk.create to check for a disk with the same name+vdc
combination before creation, and raise an error if it is attempted.

In the process, I have added specific exception classes for the various error cases of
the get_by_name_and_vdc_name() method.