Decompose Scene.vue into focused components and composables
## Description
Scene.vue is 635 lines and acts as a god component — it owns stage configuration, map lifecycle, drag-and-drop, grid management, token events, and modal orchestration simultaneously. Break it into focused composables and sub-components.
## Background
The component has grown organically as features were added. It is hard to test in isolation, difficult to reason about, and a common source of merge conflicts. Most of its logic belongs in composables or dedicated child components.
## Approach
Identify logical slices and extract them one at a time:
- **`useStage()`** — Konva stage config, scale, pan/zoom
- **`useMapLifecycle()`** — active map, map add/save/delete handlers
- **`useDragDrop()`** — `dragOver`/`drop` handlers
- **`useGridSync()`** — grid finder position, grid config updates
- Scene.vue itself becomes a thin orchestrator: mounts sub-components, wires composables, owns no business logic directly
Each extraction should leave the test suite green before moving to the next.
## Acceptance Criteria
- Scene.vue reduced to an orchestrator (target: under 150 lines)
- Extracted composables each have unit tests
- No functional regression in existing Scene.spec.js
- No change to public component interface (props/events)
## Related
- Pairs well with: #731 (Composition API migration — composables require `<script setup>`)
issue