device: added a _device_id to all drivers

this device ID identifies a specific device via the tuple of (bus, bus
type, address, devtype). This allows device specific configuration
data to be stored along with a device ID, so the code can know when
the user has changed device configuration (such as removing an
external compass), and either invalidate the device configuration or
force the user to re-calibrate
drv_mag: added devtypes for magnetometers
hmc5883: setup device type
lsm303d: setup device type
device: pass CDev::ioctl() to superclass

this allows DEVIOCGDEVICEID to work. This also changes ioctl() for
Device to match CDev
Restructure the locking around SPI transfers