fix(pycardium): Fix delay implementation

Rewrite the delay implementation to be more accurate and properly handle
incoming MicroPython interrupts (See issue #177).

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).

Signed-off-by: Rahix <rahix@rahix.de>
2 jobs for !324 with rahix/proper-sleep in 41 seconds (queued for 3 seconds)
merge request