partial commit for the heck of it
Completeling using async stuff now. Relying on Nito. I don't want to, but eh.
Conversations are implemented per-device, so there's a per device queue. Devices can have one outstanding conversation at a time: managed by a simple async lock.
Messages are dispatched to Device instance directly by the Bus. Then each Device can deal with processing them. Then represent messages originating from the true device.
Timeout support added and stuff. Basic 2.5 second timeout will return null.