cmdlib: Return RPC result in AssembleInstanceDisks

The AssembleInstanceDisks function uses internally the
call_blockdev_assemble RPC call. It does two passes with this function,
the first in the secondary and the last in the primary node. The
payloads from the latter operation can be useful to the caller for
hotplugging reasons, so we return them in array format.
config: Create wrappers for attach/detach ops

The _UnlockedAttachInstanceDisk and _UnlockedDetachInstanceDisk
functions are already used in the add and remove operations. Create
wrappers that can be used by attach and detach operations in order to
call only these functions.
constants: Add attach/detach and UUID constant

Modify Haskell code to accept the attach/detach action and the "UUID"
disk parameter. Also, modify the _ConvertNicDiskModifications function
to accept the new DDM_ATTACH/DDM_DETACH values. Finally, do minor
changes in Python code and tests in order to make the tests pass.
cmdlib: Add checks for attach/detach

Add checks for:
* number of arguments,
* instance's compatibility with disk template/nodes

and update existing ones.
cmdlib: Add core attach/detach logic

Extend _ApplyContainerMods to accept an attach and detach function.
These functions operate in the same way as the add and remove functions,
minus the disk creation and disk removal parts.

Also, add two functions that should raise an exception if one attempts
to attach/detach a NIC.

Finally, update the tests in order to work with the new
_ApplyContainerMods function.
config: Remove checks for detached disks

It is not an error sign for a configuration to have detached disks, since they
can be handled from now on by the attach/detach operations.
burnin: Test if attach/detach works properly

The attach/detach test is merged with the add/remove test. The test is
the following: an extra disk is added in each instance and is given a
random name. Once it has been added successfully, we detach it and check
if the instance operates normally. Then, we pick instances randomly and
attach a detached disk to them, using an algorithm that matches a disk
to an instance based on its disk nodes. Finally, we remove the disk.

Moreover, move the start/stop at the top of the tests, since the
start/stop functionality is erroneously used first by other functions
(e.g. rename) and then tested on its own.

Finally, split the Burner class in subclasses for maintenance reasons
and reduce the maximum number of class attributes from 20 to 19.
tests.config: Add test for GetDiskInfoByName

Check if the GetDiskInfo and GetDiskInfoByName functions operate as
expected.
tests.cmdlib: Test index operations

Test if the GetIndexFromIdentifier and InsertItemToIndex functions work
properly.
tests.opcodes/client: Add test for constants

Also, test if the ConvertNicDiskModifications function operates as
expected.
tests.config: Test attach/detach wrappers

Test if the AttachInstanceDisk and DetachInstanceDisk wrappers update
the configuration as expected.
tests.cmdlib: Check if attach/detach checks work

Also, update the mocked config to create orphan disks for attach
purposes.
tests.cmdlib: Extend tests for _ApplyContainerMods

Test if _ApplyContainerMods works properly in attach/detach scenarios.
tests.cluster: Add test for VerifyConfig

Check if VerifyConfig complains about orphan disks.
doc: Extend the design document for disks

Add more implementation info about the attach/detach operations and provide
examples for their invocation from the command line. Also, mention that detached
disks should be considered normal for a configuration and therefore, that we
remove the associated checks.
man: Update the gnt-instance man page

Add instructions on how to use the attach/detach options.