trace: Distinguish semantic version for binary version.

Binary version describes how to read the trace.  Semantic version
describes how to interpret the calls in the trace.

Binary version can change as a trace gets trimmed/edited/etc.  But
the semantic version should remain constant.
diff --git a/lib/trace/trace_parser.hpp b/lib/trace/trace_parser.hpp
index dad9f9c..25d8121 100644
--- a/lib/trace/trace_parser.hpp
+++ b/lib/trace/trace_parser.hpp
@@ -62,7 +62,7 @@
 class Parser: public AbstractParser
 {
 protected:
-    File *file;
+    File *file = nullptr;
 
     enum Mode {
         FULL = 0,
@@ -105,13 +105,17 @@
     BitmaskMap bitmasks;
     StackFrameMap frames;
 
-    FunctionSig *glGetErrorSig;
 
-    unsigned next_call_no;
+    FunctionSig *glGetErrorSig = nullptr;
 
-    unsigned long long version;
+    int next_event_type = -1;
+    unsigned next_call_no = 0;
+
+    unsigned long long version = 0;
+    unsigned long long semanticVersion = 0;
+
 public:
-    API api;
+    API api = API_UNKNOWN;
 
     Parser();
 
@@ -135,7 +139,7 @@
     void setBookmark(const ParseBookmark &bookmark) override;
 
     unsigned long long getVersion(void) const override {
-        return version;
+        return semanticVersion;
     }
 
     int percentRead()