schedule callbacks instead of running immediately to avoid locking issues