cancel method
Every cancel path (Escape, ToolController.activate, the layer's
deactivate and dispose) drops the pending shape and never touches the
document (invariant 3).
Implementation
@override
void cancel(ToolContext ctx) {
clearShape();
// Ruling F-3: a tool that returns after a switch away paints no stale
// snap marker; the next pointer move resolves a fresh one.
_hoverVisible = false;
_syncCamera(ctx);
notifyListeners();
}