refactor(protocol): rename extensionPaths map to tile vocabulary
The map in protocol.ts is keyed off built-in feature IDs (= tiles in v2)
and dev-loaded tiles registered via --load-extension. Chrome browser
extensions go through Electron's `session.loadExtension()` API and
never touch this map (see `chrome-extensions.ts`). The "extension"
naming was an artifact of the v1 extension model where tiles were
called extensions.
Renames:
- `extensionPaths` (private Map) → `tilePaths`
- `registerExtensionPath()` → `registerTilePath()`
- `getExtensionPath()` → `getTilePath()`
- `getRegisteredExtensionIds()` → `getRegisteredTileIds()`
Adjacent comments updated: "extension folder" → "tile folder",
"extension not found" → "tile not found", "stale extension window"
→ "stale tile window", per-handler docstrings clarified that the
peek://ext/{id}/ URL prefix is a legacy URL shape resolving to the
tile registry (the resolver is one and the same).
Callers updated in main.ts, ipc.ts (drops the now-unused
`getExtensionPath` import), tile-compat.ts, tile-launcher.ts,
session.ts, and the index.ts re-export surface.
yarn build clean. yarn test:unit: 2277 pass / 0 fail.