py: remove depedence on strcat and stpcpy.

This fixes Issue #29, and means the core is no longer dependent on
string functions, except strlen.
diff --git a/py/compile.c b/py/compile.c
index fe22a90..b00ab7e 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1182,13 +1182,18 @@
                 len += strlen(qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i])));
             }
             char *str = m_new(char, len + 1);
+            char *str_dest = str;
             str[0] = 0;
             for (int i = 0; i < n; i++) {
                 if (i > 0) {
-                    strcat(str, ".");
+                    *str_dest++ = '.';
                 }
-                strcat(str, qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i])));
+                const char *str_src = qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i]));
+                size_t str_src_len = strlen(str_src);
+                memcpy(str_dest, str_src, str_src_len);
+                str_dest += str_src_len;
             }
+            *str_dest = '\0';
             *q2 = qstr_from_str_take(str, len + 1);
             EMIT(import_name, *q2);
             if (is_as) {
@@ -2124,13 +2129,16 @@
 
     // allocate memory for concatenated string/bytes
     char *cat_str = m_new(char, n_bytes + 1);
-    cat_str[0] = '\0';
 
     // concatenate string/bytes
+    char *s_dest = cat_str;
     for (int i = 0; i < n; i++) {
-        const char *str = qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i]));
-        strcat(cat_str, str);
+        const char *s = qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i]));
+        size_t s_len = strlen(s);
+        memcpy(s_dest, s, s_len);
+        s_dest += s_len;
     }
+    *s_dest = '\0';
 
     EMIT(load_const_str, qstr_from_str_take(cat_str, n_bytes + 1), string_kind == MP_PARSE_NODE_BYTES);
 }