Refactored logging into its own class.
No more global variables for logging.
No need to use logger_debug() (with an underscore) any more - now we
can use logger.debug() (with a dot) instead, which calls the debug
method of our custom Logger class.  The "logger" object used throughout
the Launcher code is now a singleton object of our custom Logger class,
defined within the logger/Logger.py module.  The singleton logger object
can be imported with "from logger.Logger import logger". This refactoring
fixes issue CVLFAB-654 ("logging in LoginTask does not appear in log").

Fixed issue where "Submit error log to cvl.massive.org.au?" dialog
was always being run within wx.CallAfter(...), even though sometimes
it was already being called from the main GUI thread, so wx.CallAfter
was unnecessary, and could cause the Launcher to freeze sometimes
when pressing Cancel from the progress dialog.

Commented out logging.shutdown() in dump_log(...) for now.  This
was presumably implemented to ensure that logs were flushed, but
it seems dangerous because you are not supposed to use the logger
after calling logging.shutdown(), but the Launcher code did
continue to use the logger after the call to logging.shutdown().

Also fixed issue with auto-exit.  Now, even when auto-exit checkbox
is ticked, the Launcher will only auto-exit if TurboVNC's elapsed
time is greater than 3 seconds (as done in the production launcher
before refactoring).
Refactored logging into its own class. No more global variables for logging. No need to use logger_debug() (with an underscore) any more - now we can use logger.debug() (with a dot) instead, which calls the debug method of our custom Logger class.  The "logger" object used throughout the Launcher code is now a singleton object of our custom Logger class, defined within the logger/Logger.py module.  The singleton logger object can be imported with "from logger.Logger import logger". This refactoring fixes issue CVLFAB-654 ("logging in LoginTask does not appear in log").