Fix#1605: Debuggee process lifetime management
Mitigate #1637: log.exception() doesn't capture the full stack
Handle "launch" request, parse and validate the debug configuration, and spawn the debuggee process with debug server.
Track debuggee process and its subprocesses, and kill them as needed.
Refactor Singleton and ThreadSafeSingleton to allow for easier synchronization between IDE and server message handlers without excessive locking.
Fix various corner cases and race conditions in disconnect scenarios.
Make log.exception() log the calling stack, not just the exception stack.
Add JSON property validation to MessageDict.
Add --log-stderr switch to the server to enable full logging to stderr.
Add --cls switch to the adapter to reset terminal before logging anything (for convenience when debugging it).
Add some printf-debugging helpers.
* Add new JSON IPC implementation to be shared between the product and the tests.
Add pytest-based test support, and wire it up to setup.py and Travis.
Dial pylint down to complain about important things only.
Various minor fixes exposed by pylint.
Add basic .vscode/settings.json for linter settings (and anything else that's workspace-specific).
Fixes#831.