live_panel_output sometimes is out of sync
the log panel is still buggy

When I do `review pull request`, the output is out of sync

```
> /usr/local/bin/git fetch https://github.com/ydsdsa/AlignTab.git patch-1

[Done in 0.36s]From https://github.com/ydsdsa/AlignTab
 * branch            patch-1    -> FETCH_HEAD

```

Relevant settings
```
    "show_panel_for": [
        "commit",
        "apply",
        "fetch",
        "pull",
        "push"
    ],
    "live_panel_output": true
```

I have concluded that it is due to a synchronization issue between the io threads and the process thread. https://github.com/divmain/GitSavvy/blob/797f79ba9aa64c94efe2722eae49344b6655a66c/core/git_command.py#L106-L107

I don't have more time to further investigate now.
diff --git a/common/util/log.py b/common/util/log.py
index 6890da9f..4b235006 100644
--- a/common/util/log.py
+++ b/common/util/log.py
@@ -3,9 +3,11 @@ import sublime
 
 def panel(*msgs):
     msg = "\\n".join(str(msg) for msg in msgs)
-    sublime.active_window().active_view().run_command("gs_display_panel", {"msg": msg})
+    sublime.set_timeout_async(
+        lambda: sublime.active_window().active_view().run_command("gs_display_panel", {"msg": msg}))
 
 
 def panel_append(*msgs):
     msg = "\\n".join(str(msg) for msg in msgs)
-    sublime.active_window().active_view().run_command("gs_append_panel", {"msg": msg})
+    sublime.set_timeout_async(
+        lambda: sublime.active_window().active_view().run_command("gs_append_panel", {"msg": msg}))
diff --git a/core/git_command.py b/core/git_command.py
index 67a2c5c6..a04260c1 100755
--- a/core/git_command.py
+++ b/core/git_command.py
@@ -65,7 +65,7 @@ class LoggingProcessWrapper(object):
 
     def read_stdout(self):
         try:
-            for line in self.process.stdout:
+            for line in iter(self.process.stdout.readline, b""):
                 self.stdout = self.stdout + line
                 util.log.panel_append(line.decode())
         except IOError as err:
@@ -73,7 +73,7 @@ class LoggingProcessWrapper(object):
 
     def read_stderr(self):
         try:
-            for line in self.process.stderr:
+            for line in iter(self.process.stderr.readline, b""):
                 self.stderr = self.stderr + line
                 util.log.panel_append(line.decode())
         except IOError as err:
@@ -100,11 +100,9 @@ class LoggingProcessWrapper(object):
 
         savvy_settings = sublime.load_settings("GitSavvy.sublime-settings")
         timeout = savvy_settings.get("live_panel_output_timeout", 10000)
-        # 10s timeout default
-        max_run_time = time.monotonic() - timeout
 
-        stdout_thread.join(self.process._remaining_time(max_run_time))
-        stderr_thread.join(self.process._remaining_time(max_run_time))
+        stdout_thread.join(timeout / 1000)
+        stderr_thread.join(timeout / 1000)
 
         return self.stdout, self.stderr
 
['common/util/log.py', 'core/git_command.py']