[BUG] Refreshing browser tab exits session.wait()
Refreshing the App window in the browser causes `session.wait()` to exit, but the intention is that `session.wait()` should only exit when the App window is actually closed.

This is worth addressing because refreshing the App window via ctrl + R is a common practice for App users.

```py
import fiftyone as fo 

session = fo.launch_app()

# should block until App is closed, but ctrl + R also breaks
session.wait()  
```

diff --git a/fiftyone/server/main.py b/fiftyone/server/main.py
index c07fa75b5..97d8b71d3 100644
--- a/fiftyone/server/main.py
+++ b/fiftyone/server/main.py
@@ -206,6 +206,7 @@ def _catch_errors(func):
 
 _notebook_clients = {}
 _deactivated_clients = set()
+_DISCONNECT_TIMEOUT = 1  # seconds
 
 
 class PollingHandler(tornado.web.RequestHandler):
@@ -421,8 +422,13 @@ class StateHandler(tornado.websocket.WebSocketHandler):
         """
         StateHandler.clients.remove(self)
         StateHandler.app_clients.discard(self)
-        if not StateHandler.app_clients:
-            _write_message({"type": "close"}, session=True)
+
+        async def close_wait():
+            await asyncio.sleep(_DISCONNECT_TIMEOUT)
+            if not StateHandler.app_clients:
+                _write_message({"type": "close"}, session=True)
+
+        tornado.ioloop.IOLoop.current().add_callback(close_wait)
 
     @_catch_errors
     async def on_message(self, message):
['fiftyone/server/main.py']