add `Action.canUndo` and make the action's `Undo` constructor args [optional]

first step towards #4