Timer management code often loops over the list of timers, calling independant callbacks that end up freeing other timers in the list. That would result in potentail access-after-free errors, as reported in #105160. The typical identified scenario is wmTimer calling wmJob code, which calls some of the job's callbacks (`update` or `end` e.g.), which call `WM_report`, which removes and add another timer. To address this issue on a general level, the deletion of timers is now deferred, with the public API `WM_event_remove_timer` only marking the timer for deletion, and the private new function `wm_window_delete_removed_timers` effectively removing and deleting all marked timers. This implements design task #105369. Pull Request #105380