tryStart method
Start a tour unless one is already running — atomic, no assert.
Returns false when busy (no state change), true when started.
Prefer over if (isIdle) await start(tour) — that check-then-act
races if two callers fire at once. isIdle stays for UI state.
Implementation
Future<bool> tryStart(HintTour tour) async {
if (!isIdle) return false;
await start(tour);
return true;
}