Fix for race condition between cancel(true) and thread interruption

Basically by changing semantics: non-cancellable tasks being
interrupted will always send canceled event.