Rewrite the delay implementation to be more accurate and properly handle incoming MicroPython interrupts (See issue #177 (closed)).
For this, the delay is split into two functions:
- systick_delay_precise(): Delay with microsecond accuracy for delays less than 1 ms.
- systick_delay_sleep(): Sleep for a potentially very long time, using WFI to put the CPU to sleep. Whenever the CPU wakes up, this function will poll the MicroPython scheduler so it can execute pending interrupts.
Ontop, this implementation allows for a future, fast, tick-based monotonic time implementation (e.g. mp_hal_ticks_ms).
Fixes #177 (closed).