Bind extension instances only when what they bind to changes
An idle extension panel no longer rebinds and schedules a step on every frame.
ExtensionHost::bind now remembers what it last bound (owner, project, session, agent, device, on-screen state, rail prefs, catalog revision and theme mode) and returns at once when none of them changed. Before, every render scheduled a step for every active extension panel.
Measured with the Workbench extension’s spinner running, binds fell from 9.1 to 0 per second and panel steps from 9.0 to 0, with frames dropping from 9.1 to 6.6 per second. Frame times were not compared because the machine was heavily loaded.
NAPDOCK_BENCH now also counts binds and steps. Part of #164.
Evidence
No screenshot: The panel looks the same and does less work, so there is nothing to screenshot; the evidence is a benchmark.