- failStepRun was calling closeBrowserHandle immediately, removing the
handle before maybePreserveSession could read it in the finally block
- delegate browser lifecycle to maybePreserveSession for both pass and
fail paths so saveSession=true is honoured regardless of run outcome