Assignment changes now audited: ASSIGNMENT ToolEvent on every move

PATCH /api/v1/tools/{id} (and the in-app PATCH) now emit an ASSIGNMENT ToolEvent each time assignedUserId, assignedVehicleId, assignedYardId, or parentKitId changes. The description uses a structured 'assignment_changed: type=X from=A to=B' prefix so audit consumers parse the move directly out of the events feed (iter 88) without joining the Tool table. The ASSIGNMENT ToolEventKind was declared in the enum from v1 but never emitted — this closes that gap. Same-value PATCHes don't emit (no no-op events). 8 new tests cover single + multi-field changes, no-emit on unchanged, kit transitions, null-side rendering, fallback when actorId is unset (CSV import path), and best-effort failure recovery.