fix: gracefully handle IndexedDB connection-closing errors on iOS
- withTransaction now returns undefined instead of throwing when
InvalidStateError persists after retry (transient browser event)
- Add .catch() to fire-and-forget cleanOldSnapshots() call