This implements a better (more python-conformant) list.sort.

It's not really about that, though; it's about me figuring out a sane
way forward for keyword-argument functions (and function
metadata). But it's useful as is, and shouldn't break any existing
code, so here you have it; I'm going to park it in my mind for a bit
while sorting out the rest of the dict branch.
diff --git a/py/objtuple.c b/py/objtuple.c
index ceca420..2205b86 100644
--- a/py/objtuple.c
+++ b/py/objtuple.c
@@ -97,8 +97,8 @@
 }
 
 const mp_obj_type_t tuple_type = {
-    { &mp_const_type },
-    "tuple",
+    .base = { &mp_const_type },
+    .name = "tuple",
     .print = tuple_print,
     .make_new = tuple_make_new,
     .binary_op = tuple_binary_op,
@@ -110,7 +110,7 @@
 static const mp_obj_tuple_t empty_tuple_obj = {{&tuple_type}, 0};
 const mp_obj_t mp_const_empty_tuple = (mp_obj_t)&empty_tuple_obj;
 
-mp_obj_t mp_obj_new_tuple(uint n, mp_obj_t *items) {
+mp_obj_t mp_obj_new_tuple(uint n, const mp_obj_t *items) {
     if (n == 0) {
         return mp_const_empty_tuple;
     }
@@ -123,7 +123,7 @@
     return o;
 }
 
-mp_obj_t mp_obj_new_tuple_reverse(uint n, mp_obj_t *items) {
+mp_obj_t mp_obj_new_tuple_reverse(uint n, const mp_obj_t *items) {
     if (n == 0) {
         return mp_const_empty_tuple;
     }
@@ -163,8 +163,8 @@
 }
 
 static const mp_obj_type_t tuple_it_type = {
-    { &mp_const_type },
-    "tuple_iterator",
+    .base = { &mp_const_type },
+    .name = "tuple_iterator",
     .iternext = tuple_it_iternext,
     .methods = {{NULL, NULL},},
 };