Reduce UI interference with benchmark sampling

- breathe animation now uses transform/opacity only (no per-frame
  box-shadow repaints during the 36s run)
- stats table rows built once; updates touch textContent/styles instead
  of rebuilding via innerHTML every refresh
- DOM/canvas painting aligned to requestAnimationFrame behind the
  existing 250ms throttle
- onUpdate no longer awaited in the sample loop, documented as
  sync-and-cheap
- warn when the tab was backgrounded (throttled timers thin samples)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
