Refactor 'Task' protocol, add 'cancel' operation