* Documentation - README.md - Literally every trait and method. * Use channel for interrupt -> task messages. Currently we use a static mut which holds the latest event. This was done for expediency to try and get somethnig working and this was working in Arduino. It's also massively wrong in the general case and overflowing with race conditions. A channel will allow us to deterministically walk events and make sure everything's ordered properly. * Clean up pipe descriptor stuff. There's a bunch of unsafe functions that can be made safe. * Some SVD patches needed for SAMD21/51. There's a lot of `unsafe` code where there shouldn't be, because the SVD files are lacking. * Stop passing millis function around. This is horrible, but currently necessary because there are places where we need to loop on a timer at it needs to be hardware-independent. If the USB host library can be made asynchronouse, we could instead pass a current timestamp around and use that for delays where necessary. As a last resort, there's a countdown timer trait in embedded-hal that may be useful. * Tighten up timings on requests. There are a few timer checks on USB requests, but not necessarily of the right duration nor subdivided correctly. For instance, the setup-with-data cycle has requirements on total duration as well as per-packet duration, but currently we're only using the total.