We didn't dispatch libinput before evdev events started flowing, meaning the devices libinput discovered from udev when its seat was assigned was not noticed by mutter until it later saw things on libinput's fd.
Also some extra cleanups that I took from another branch to prepare for headlessness.