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