* Make blocking APIs optionally async
`DeviceInfo::open`, `Device::from_fd`, `Device::set_configuration`,
`Device::reset`, `Interface::set_alt_setting`, `Interface::clear_halt`
all perform IO but are currently blocking because the underlying OS APIs
are blocking.
`list_devices`,`list_buses`, `Device::claim_interface`
`Device::detach_and_claim_interface` theoretically don't perform IO, but
are also included here because they need to be async on WebUSB.
The `MaybeFuture` trait allows deferring these actions to the thread pool
from the `blocking` crate when used asynchronously with `.await` /
`IntoFuture`, or directly runs the blocking syscall synchronously with a
`.wait()` method.
We'll log if the ioctl failed, but there's probably not a use case to
determine why it failed to justify Result<Option<>>. It'll be
infallible (besides unknown values) on other platforms.
Unlike the Configuration descriptor, it does not contain nested
descriptors.
It's also made infallible, because the kernel wouldn't enumerate
the device without it.
root hubs are a Linuxism - an abstract USB device capturing
information about a system USB bus; connected to a Host Controller. Bus
data is useful for system profiling so a BusInfo type is added to crate
a more portable 'root hub' type.
Considering whether to use a HostControllerInfo highlighted the place
for root hubs. There can be multiple system USB buses on a Host
Controller Interface (HCI), so it makes sense to have a separate type.
Multiple buses can share the same PciInfo for example because they sit
on the same HCI.