Fix splash screen hang from stale persisted state
Three issues could cause the app to hang on the splash screen forever
when the browser has stale localStorage/IndexedDB data from a previous
deployment:
1. Promise.all in App had no .catch() handler. If initPersistedState()
or setupDeviceId rejected, setReady(true) never fired.
2. features.init used the async executor anti-pattern: if GrowthBook
init threw (e.g. CORS failure, corrupted cache), the wrapping
Promise never settled because resolve() was never called.
3. InnerApp.onLaunch awaits resumeSession/features.init, but if either
promise never settles (e.g. IndexedDB upgrade blocked by stale
version), the finally block never runs and setIsReady(true) never
fires. Added a 15-second safety timeout to guarantee the app loads.