Allow preempt_{en,dis}able() to be called in early boot

Signed-off-by: Alex Smith <alex@alex-smith.me.uk>
Handle CPU migration in spin() and fix SMP safety in system_time()

A CPU migration could occur during a spin() which would affect the timing.
Detect a change in CPU ID and recalculate the target time. Also add
necessary preempt_disable() for curr_cpu accesses.

Signed-off-by: Alex Smith <alex@alex-smith.me.uk>