Using an actual mutex has the useful property that we will now record thread ownership of the lock.
The next step is to figure out if we can devise a criteria for when it's OK that a thread's proceeded to call into atkbdc without the lock so we can add some proper assertions to atkbdc. For kbd we generally use kdb_active || panicstr != NULL, but other concerns have been raised in the past about things I'm not well-versed in; e.g. IPI stop.