Choosing between manual setTimeout and grunt.util.spawn.timeout for Grunt task cancellation
Goal: allow a long‑running Grunt watch task to stop promptly when an external cancellation signal is received, without leaving child processes alive. Constraint: a manual timeout implemented with setTimeout can invoke the async callback and mark the task as failed, but it does not terminate any processes that the task may have spawned, potentially leaving or