Keeper code is just a conditional resynch:
if (delay > myQuantum) { sc_wait(delay); delay = 0; }
By calling wait(delay) the simulation time will advance to where the caller has got to while running other pending processes.
Or where a thread needs to block to wait for a result from some other thread:
while (!condition_of_interest) { sc_wait(delay); delay = 0; }
Loosely-timed is appropriate for software development. It supports modelling of timers and interrupts, sufficient to boot an operating system.
Simulation time still exists, but processes may be temporally decoupled from simulation time.
Transactions may execute in a different sequence from reality: sequential consistency compromised ?