feat(038): API-key revoke endpoint + Console revoke + api_keys.js E2E

Final slice of the multiple-API-keys feature (PRD 034). Let an Account revoke a
specific key from an App, end to end — it dies immediately and permanently while
the App's other keys keep working — and prove the whole feature composes with an
HTTP-level integration suite. The RevokeKey service spine (hard delete,
owner-scoped, idempotent, no floor) landed in 035; this adds the HTTP handler,
the per-row Console revoke action, and tests/api_keys.js.

Key decisions:
- Extended the KeyManager seam with RevokeKey; the RevokeKey handler is
  owner-scoped (owner = auth.IdentityID(ctx), App = :id, key = :keyId). Chose 204
  (not 404) for revoking a missing key on an OWNED App — the service is idempotent
  there — and reserved 404 for a not-owned/missing App. Within either ownership
  class the response is uniform, so existence never leaks (see handler godoc).
- Frontend: each key row gains a Revoke button gated by a confirm modal
  (revocation is immediate + permanent); on success the list reloads in place.
- tests/api_keys.js reuses remove_app.js's probeKey liveness trick (live key →
  invalid_grant on a bogus code; dead key → invalid_client) to observe revocation
  over HTTP, and drives the full feature: born-with-Admin-key, create second, both
  authenticate, owner-scoping, revoke Admin (dead while second lives), list shows
  only the survivor, idempotent re-revoke, ceiling of 10 (11th→409), revoke-all→
  empty→create-again.

Files:
- pkg/registry/apikey_http.go: +RevokeKey on the seam + the handler.
- pkg/registry/apikey_http_test.go: hard-delete-leaves-others, missing-key→204
  (idempotent), not-owned→404 (victim untouched), last-key→204 (no floor).
- cmd/server/main.go: +DELETE /api/v1/apps/:id/keys/:keyId.
- frontend: apps.ts +revokeKey(); apps/[id]/+page.svelte per-row Revoke + confirm
  modal, reload-on-success; dropped the "coming next" note.
- tests/api_keys.js (new) + tests/all.js: the end-to-end suite.
- issues/done/038 (ACs ticked + note).

Notes:
- PRD 034 (issues 035–038) is fully landed; no open API-key issues remain.
- k6 archive compiles the suite; not run live (needs server + Postgres +
  CONSOLE_REALM_ID). Go tests green. Swagger gitignored (regenerate locally).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
