Introduce the notion of a Plug
A plug stores a pointer to another device. A plug can store a pointer to a
base class or it can store a pointer to a specific device type. In the case
of the i8042, the controller only supports two types of devices and the devices
must occur on a specific port.
Besides providing for better marshalling support, a plug has NULL pointer
dereferencing checks built into it. For the i8042, I need to update the code
to work properly with empty plugs.
Plugs need to be part of the factory interface. So far we've been dealing with
non-optional devices that are constructed purely by composition. Now that we
have optional devices, we need a generic way to instantiate the optional devices
and to attach them to the appropriate devices.