tool.serviced webhook (13th event type) + OpenAPI mark-serviced spec

POST /api/v1/tools/{id}/mark-serviced now fires a tool.serviced webhook alongside the internal AUDIT ToolEvent. Payload carries previousLastServicedAt (null on first service), newLastServicedAt, the pmIntervalDays in effect at service time, the actorId, and any free-form note — depreciation systems, OEM warranty trackers, and CMMS exports subscribing to it no longer have to poll the events feed for PM completions. Best-effort emission (won't fail the service record if delivery enqueue rejects). Same iteration also adds the previously-undocumented mark-serviced endpoint to /openapi.yaml — until now it shipped in code (iter 86) but had no OpenAPI definition, so codegen consumers couldn't see it. 5 new contract tests cover success, previous=null on first service, no-emit on 404, no-emit on 422 (missing pmIntervalDays), and best-effort failure recovery. /docs/api/webhooks + /integrations/zapier both surface the new event; Zapier headline goes from ten to eleven tool/fleet events.