Add backend functions for container member set management.
Add a ContainerDevice class to consolidate member management code.
Adapt callers to new method names for add/remove member device.
Add type-specific methods for member set management.
Add a property to provide consistent access to parent container device.
Add action classes for container member set management.
Make sorting by action type part of the action classes.
Add some checking to MDRaidArrayDevice._setSpares.
Support mutually-obsoleting actions.

This is for action loops like adding a device as a PV and then removing
it from the VG.
Improve the mechanism for VG completeness.

Do not modify self.pvCount -- that makes it meaningless as it was
obtained by lvm.

Do not worry about completeness if no pvCount was passed in for an
existing VG.

Because we instantiate all Device classes with exists=False when unit
testing, add a hack to StorageTestCase.newDevice to set completeness
appropriately for existing VGs.
Set device uuid before calling Device ctor.

It is needed by ContainerDevice._addParent.
Convert ContainerDevice to an abstract base class.
Change management of Device parents to use a simple list interface.

The parent list is an instance of class ParentList, which provides a
simplified list interface with the addition of an element uniqueness
constraint and optional user-defined pre-add and pre-remove functions.

Before, to modify a device's parent set, you'd do this:

 device.parents.append(newparent)
 newparent.addChild()

or this, if device is a container type:

 device._addMember(newparent)

Now, regardless of the type of device, you do this:

 device.parents.append(newparent)

Any checking or accounting is handled by the callbacks registered to
the parent list.
Adapt callers to use the new parent list interface.