`globus login` incorrectly captures KeyboardInterrupt in fancy browser mode
Easy to reproduce:

1. `globus login` to start the login flow with the browser interactivity.
2. Go back to the shell where `globus login` is running
3. Ctrl+C

Nothing happens.
The login command should die upon receipt of an interrupt.

I can workaround this by `Ctrl+Z; jobs; kill %n`, but that's silly.
diff --git a/globus_cli/helpers/local_server.py b/globus_cli/helpers/local_server.py
index 2898394..27dedcb 100644
--- a/globus_cli/helpers/local_server.py
+++ b/globus_cli/helpers/local_server.py
@@ -27,6 +27,8 @@ try:
 except ImportError:
     from urllib.parse import urlparse, parse_qsl
 
+from globus_cli.safeio import safeprint
+
 
 class LocalServerError(Exception):
     pass
@@ -139,7 +141,15 @@ class RedirectHTTPServer(HTTPServer, object):
         self._auth_code_queue.put_nowait(code)
 
     def wait_for_code(self):
-        return self._auth_code_queue.get(block=True)
+        # workaround for handling control-c interrupt.
+        # relevant Python issue discussing this behavior:
+        # https://bugs.python.org/issue1360
+        try:
+            return self._auth_code_queue.get(block=True, timeout=3600)
+        except Queue.Empty:
+            safeprint(
+                'Login timed out. Please try again.', write_to_stderr=True)
+            sys.exit(1)
 
 
 @contextmanager
['globus_cli/helpers/local_server.py']