py: Add MP_OBJ_STOP_ITERATION and make good use of it.

Also make consistent use of MP_OBJ_NOT_SUPPORTED and MP_OBJ_NULL.
This helps a lot in debugging and understanding of function API.
diff --git a/py/runtime.c b/py/runtime.c
index 5dc86ff..7830301 100644
--- a/py/runtime.c
+++ b/py/runtime.c
@@ -163,7 +163,7 @@
         mp_obj_type_t *type = mp_obj_get_type(arg);
         if (type->unary_op != NULL) {
             mp_obj_t result = type->unary_op(op, arg);
-            if (result != NULL) {
+            if (result != MP_OBJ_NOT_SUPPORTED) {
                 return result;
             }
         }
@@ -402,7 +402,7 @@
         mp_obj_type_t *type = mp_obj_get_type(rhs);
         if (type->binary_op != NULL) {
             mp_obj_t res = type->binary_op(op, rhs, lhs);
-            if (res != MP_OBJ_NULL) {
+            if (res != MP_OBJ_NOT_SUPPORTED) {
                 return res;
             }
         }
@@ -410,7 +410,7 @@
             /* second attempt, walk the iterator */
             mp_obj_t next = NULL;
             mp_obj_t iter = mp_getiter(rhs);
-            while ((next = mp_iternext(iter)) != MP_OBJ_NULL) {
+            while ((next = mp_iternext(iter)) != MP_OBJ_STOP_ITERATION) {
                 if (mp_obj_equal(next, lhs)) {
                     return mp_const_true;
                 }
@@ -430,7 +430,7 @@
     type = mp_obj_get_type(lhs);
     if (type->binary_op != NULL) {
         mp_obj_t result = type->binary_op(op, lhs, rhs);
-        if (result != MP_OBJ_NULL) {
+        if (result != MP_OBJ_NOT_SUPPORTED) {
             return result;
         }
     }
@@ -580,7 +580,7 @@
         // extract the variable position args from the iterator
         mp_obj_t iterable = mp_getiter(pos_seq);
         mp_obj_t item;
-        while ((item = mp_iternext(iterable)) != MP_OBJ_NULL) {
+        while ((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
             if (args2_len >= args2_alloc) {
                 args2 = m_renew(mp_obj_t, args2, args2_alloc, args2_alloc * 2);
                 args2_alloc *= 2;
@@ -617,7 +617,7 @@
         mp_load_method(kw_dict, MP_QSTR_items, dest);
         mp_obj_t iterable = mp_getiter(mp_call_method_n_kw(0, 0, dest));
         mp_obj_t item;
-        while ((item = mp_iternext(iterable)) != MP_OBJ_NULL) {
+        while ((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
             if (args2_len + 1 >= args2_alloc) {
                 uint new_alloc = args2_alloc * 2;
                 if (new_alloc < 4) {
@@ -662,12 +662,12 @@
 
         for (seq_len = 0; seq_len < num; seq_len++) {
             mp_obj_t el = mp_iternext(iterable);
-            if (el == MP_OBJ_NULL) {
+            if (el == MP_OBJ_STOP_ITERATION) {
                 goto too_short;
             }
             items[num - 1 - seq_len] = el;
         }
-        if (mp_iternext(iterable) != MP_OBJ_NULL) {
+        if (mp_iternext(iterable) != MP_OBJ_STOP_ITERATION) {
             goto too_long;
         }
     }
@@ -716,13 +716,13 @@
         mp_obj_t item;
         for (seq_len = 0; seq_len < num_left; seq_len++) {
             item = mp_iternext(iterable);
-            if (item == MP_OBJ_NULL) {
+            if (item == MP_OBJ_STOP_ITERATION) {
                 goto too_short;
             }
             items[num_left + num_right + 1 - 1 - seq_len] = item;
         }
         mp_obj_t rest = mp_obj_new_list(0, NULL);
-        while ((item = mp_iternext(iterable)) != MP_OBJ_NULL) {
+        while ((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
             mp_obj_list_append(rest, item);
         }
         uint rest_len;
@@ -864,7 +864,7 @@
     }
 }
 
-// may return MP_OBJ_NULL as an optimisation instead of raise StopIteration()
+// may return MP_OBJ_STOP_ITERATION as an optimisation instead of raise StopIteration()
 // may also raise StopIteration()
 mp_obj_t mp_iternext_allow_raise(mp_obj_t o_in) {
     mp_obj_type_t *type = mp_obj_get_type(o_in);
@@ -883,7 +883,7 @@
     }
 }
 
-// will always return MP_OBJ_NULL instead of raising StopIteration() (or any subclass thereof)
+// will always return MP_OBJ_STOP_ITERATION instead of raising StopIteration() (or any subclass thereof)
 // may raise other exceptions
 mp_obj_t mp_iternext(mp_obj_t o_in) {
     mp_obj_type_t *type = mp_obj_get_type(o_in);
@@ -902,7 +902,7 @@
                 return ret;
             } else {
                 if (mp_obj_is_subclass_fast(mp_obj_get_type(nlr.ret_val), &mp_type_StopIteration)) {
-                    return MP_OBJ_NULL;
+                    return MP_OBJ_STOP_ITERATION;
                 } else {
                     nlr_raise(nlr.ret_val);
                 }