Fix github issue #23, not parsing an escape char case properly.

It turns out that unrecognized characters in escape sequences
should be tolerated and passed through. This change implements that and
also adds support for \0 in string literals:

    $ python3
    >>> import json5
    >>> json5.loads(r'"\/"')
    '/'
    >>> json5.loads(r'"\0"')
    '\x00'
    >>> quit()
    $
diff --git a/json5/json5.g b/json5/json5.g
index e4ed365..1bbb798 100644
--- a/json5/json5.g
+++ b/json5/json5.g
@@ -52,6 +52,8 @@
                | squote                              -> '\u0027'
                | dquote                              -> '\u0022'
                | bslash                              -> '\u005C'
+               | ~('x'|'u'|digit|eol) anything:c     -> c
+               | '0' ~digit                          -> '\u0000'
                | hex_esc:c                           -> c
                | unicode_esc:c                       -> c
 
diff --git a/json5/parser.py b/json5/parser.py
index be48dd5..7a16e5b 100644
--- a/json5/parser.py
+++ b/json5/parser.py
@@ -393,7 +393,8 @@
                       self._esc_char__c4_, self._esc_char__c5_,
                       self._esc_char__c6_, self._esc_char__c7_,
                       self._esc_char__c8_, self._esc_char__c9_,
-                      self._esc_char__c10_])
+                      self._esc_char__c10_, self._esc_char__c11_,
+                      self._esc_char__c12_])
 
     def _esc_char__c0_(self):
         self._seq([lambda: self._ch('b'), lambda: self._succeed('\b')])
@@ -402,10 +403,20 @@
         self._seq([lambda: self._ch('f'), lambda: self._succeed('\f')])
 
     def _esc_char__c10_(self):
-        self._push('esc_char__c10')
+        self._seq([lambda: self._ch('0'), lambda: self._not(self._digit_),
+                   lambda: self._succeed('\x00')])
+
+    def _esc_char__c11_(self):
+        self._push('esc_char__c11')
+        self._seq([lambda: self._bind(self._hex_esc_, 'c'),
+                   lambda: self._succeed(self._get('c'))])
+        self._pop('esc_char__c11')
+
+    def _esc_char__c12_(self):
+        self._push('esc_char__c12')
         self._seq([lambda: self._bind(self._unicode_esc_, 'c'),
                    lambda: self._succeed(self._get('c'))])
-        self._pop('esc_char__c10')
+        self._pop('esc_char__c12')
 
     def _esc_char__c2_(self):
         self._seq([lambda: self._ch('n'), lambda: self._succeed('\n')])
@@ -430,10 +441,26 @@
 
     def _esc_char__c9_(self):
         self._push('esc_char__c9')
-        self._seq([lambda: self._bind(self._hex_esc_, 'c'),
+        self._seq([self._esc_char__c9__s0_,
+                   lambda: self._bind(self._anything_, 'c'),
                    lambda: self._succeed(self._get('c'))])
         self._pop('esc_char__c9')
 
+    def _esc_char__c9__s0_(self):
+        self._not(lambda: (self._esc_char__c9__s0_n_g_)())
+
+    def _esc_char__c9__s0_n_g_(self):
+        self._choose([self._esc_char__c9__s0_n_g__c0_,
+                      self._esc_char__c9__s0_n_g__c1_,
+                      lambda: self._seq([self._digit_]),
+                      lambda: self._seq([self._eol_])])
+
+    def _esc_char__c9__s0_n_g__c0_(self):
+        self._seq([lambda: self._ch('x')])
+
+    def _esc_char__c9__s0_n_g__c1_(self):
+        self._seq([lambda: self._ch('u')])
+
     def _hex_esc_(self):
         self._push('hex_esc')
         self._seq([lambda: self._ch('x'), lambda: self._bind(self._hex_, 'h1'),
diff --git a/json5/tests/json5_test.py b/json5/tests/json5_test.py
index 2551dbc..d564c50 100644
--- a/json5/tests/json5_test.py
+++ b/json5/tests/json5_test.py
@@ -196,6 +196,12 @@
         self.check_fail("'\\u0j00'")
         self.check_fail("'\\uj000'")
 
+    def test_unrecognized_escape_char(self):
+        self.check(r'"\/"', '/')
+
+    def test_nul(self):
+        self.check(r'"\0"', '\x00')
+
     def test_whitespace(self):
         self.check('\n1', 1)
         self.check('\r1', 1)