MEGA CHANGES IN THIS COMMIT!  A new file synchronization mechanism, support for specifying remote terminal encodings (e.g. use 'cp437' for scoansi, 'rot13' for a laugh), more decoupling of the terminal from Gate One's core, and loads of new functions and improvements.  Too much to list.  I've included the highlights below...
gateone.py:  Updated to reflect that Gate One now requires Tornado 2.4+ (because of changes to the options module and important WebSocket fixes).
gateone.py:  Changed get_style() to get_theme() and re-worked it's logic a bit to use the new caching mechanism.  The 'plugins' functionality will now be handled via the send_js_or_css() function.  The 'colors' functionality will be taken care of in app_terminal.py.  Lastly, it will automatically send the print stylesheet as-needed via the new file sync mechanism.
gateone.py:  send_js_or_css() can now take a list or tuple of file paths or file objects (instead of just a single path or file object).
gateone.py:  Added a new function: ApplicationWebSocket.file_request().  It sends the given file (or files if a list/tuple) to the client.  It's used by the new client-side caching mechanism.
gateone.py:  Added a new function: ApplicationWebSocket.cache_cleanup().  After the file/cache synchronization process is complete the client will send a list of its cached files to this function via the 'go:cache_cleanup' WebSocket action.  This function will check to see if those files still exist in the cache and if not, sends the 'go:cache_expired' WebSocket action to the client with a list of filanems (hashes, really) that are safe to delete.
gateone.py:  The client-side cache mechanism can be disabled by setting 'use_client_cache' in settings/10server.conf.
gateone.js *and* terminal.js:  Tons of little bits of code were moved around and changed to make way for generic workspaces.  Too much to list.  Stuff like:  The logic that closes open terminals when the connection is lost was moved to GateOne.Terminal.connectionError().
gateone.js:  Removed the memoization inside of GateOne.Utils.getNode().  It was causing garbage collection issues.
gateone.js:  Added a new module:  GateOne.Storage.  It can be used to store data in IndexedDB with fallback to localStorage.  It is used by the new caching mechanism.
gateone.js:  Added loads of new doctstrings.  Still lots more to go though!
app_terminal.py:  Added TerminalApplication.terminals().  It sends a list of open terminals to the client.  This function is now necessary because the terminal.js may not be fully loaded before the authentication phase of the session is complete.
app_terminal.py:  A number of WebSocket actions have been prefixed with 'terminal:'.  Their respective calling functions in terminal.js have been adjusted to reflect this as well.
app_terminal.py:  Most of the text colors functionality has been moved out of gateone.py and into TerminalApplication.  All that's left is the 'theme enumeration' bits.
terminal.js:  Moved timeoutAction() back to GateOne.Net in gateone.js.  It isn't terminal-specific.
terminal.js:  Changed the name of the 'terminals' WebSocket action to 'terminal:terminals' (they're all getting prefixed with 'terminal:' eventually).
terminal.js:  Got rid of the termSelectCallback stuff.  It was never really used for its intended purpose.  A much better mechanism exists now:  GateOne.Events.on('terminal:switch_terminal').
terminal.js:  Added lots of documentation strings.  I think it might have full coverage now!
Playback Plugin:  Some tweaks here and there to make it work with some of the recent changes to terminal.py.
SSH Plugin:  Added an empty string to the os.execvpe() call to resolve the problems experienced on OpenBSD.  This should close issue #161 (https://github.com/liftoff/GateOne/issues/161).
Themes:  Added some new stuff related to workspaces and some, er, special unannounced forthcoming features.