py: Clear allocated, but unused memory in containers.

Also, clear up freed slots in containers.

As a follow up to 32bef315be8e56ad2d7f69223fe7b9606893b6ab.
diff --git a/py/obj.h b/py/obj.h
index 5bf5352..35c98d3 100644
--- a/py/obj.h
+++ b/py/obj.h
@@ -539,3 +539,5 @@
 bool mp_seq_cmp_objs(int op, const mp_obj_t *items1, uint len1, const mp_obj_t *items2, uint len2);
 mp_obj_t mp_seq_index_obj(const mp_obj_t *items, uint len, uint n_args, const mp_obj_t *args);
 mp_obj_t mp_seq_count_obj(const mp_obj_t *items, uint len, mp_obj_t value);
+// Helper to clear stale pointers from allocated, but unused memory, to preclude GC problems
+#define mp_seq_clear(start, len, alloc_len, item_sz) memset((byte*)(start) + (len) * (item_sz), 0, ((alloc_len) - (len)) * (item_sz))
diff --git a/py/objarray.c b/py/objarray.c
index ce107dd..ea37655 100644
--- a/py/objarray.c
+++ b/py/objarray.c
@@ -125,6 +125,7 @@
         // TODO: alloc policy
         self->free = 8;
         self->items = m_realloc(self->items,  item_sz * self->len, item_sz * (self->len + self->free));
+        mp_seq_clear(self->items, self->len + 1, self->len + self->free, item_sz);
     }
     mp_binary_set_val_array(self->typecode, self->items, self->len++, arg);
     self->free--;
diff --git a/py/objlist.c b/py/objlist.c
index 6de07cf..0c55f52 100644
--- a/py/objlist.c
+++ b/py/objlist.c
@@ -163,6 +163,7 @@
     if (self->len >= self->alloc) {
         self->items = m_renew(mp_obj_t, self->items, self->alloc, self->alloc * 2);
         self->alloc *= 2;
+        mp_seq_clear(self->items, self->len + 1, self->alloc, sizeof(*self->items));
     }
     self->items[self->len++] = arg;
     return mp_const_none; // return None, as per CPython
@@ -178,6 +179,7 @@
             // TODO: use alloc policy for "4"
             self->items = m_renew(mp_obj_t, self->items, self->alloc, self->len + arg->len + 4);
             self->alloc = self->len + arg->len + 4;
+            mp_seq_clear(self->items, self->len + arg->len, self->alloc, sizeof(*self->items));
         }
 
         memcpy(self->items + self->len, arg->items, sizeof(mp_obj_t) * arg->len);
@@ -199,6 +201,8 @@
     mp_obj_t ret = self->items[index];
     self->len -= 1;
     memcpy(self->items + index, self->items + index + 1, (self->len - index) * sizeof(mp_obj_t));
+    // Clear stale pointer from slot which just got freed to prevent GC issues
+    self->items[self->len] = MP_OBJ_NULL;
     if (self->alloc > LIST_MIN_ALLOC && self->alloc > 2 * self->len) {
         self->items = m_renew(mp_obj_t, self->items, self->alloc, self->alloc/2);
         self->alloc /= 2;
@@ -253,6 +257,7 @@
     self->len = 0;
     self->items = m_renew(mp_obj_t, self->items, self->alloc, LIST_MIN_ALLOC);
     self->alloc = LIST_MIN_ALLOC;
+    mp_seq_clear(self->items, 0, self->alloc, sizeof(*self->items));
     return mp_const_none;
 }
 
@@ -368,6 +373,7 @@
     o->alloc = n < LIST_MIN_ALLOC ? LIST_MIN_ALLOC : n;
     o->len = n;
     o->items = m_new(mp_obj_t, o->alloc);
+    mp_seq_clear(o->items, n, o->alloc, sizeof(*o->items));
 }
 
 STATIC mp_obj_list_t *list_new(uint n) {