py: Make built-in 'range' a class.

Addresses issue #487.
diff --git a/py/objrange.c b/py/objrange.c
index 64d9245..45f8358 100644
--- a/py/objrange.c
+++ b/py/objrange.c
@@ -5,38 +5,7 @@
 #include "mpconfig.h"
 #include "qstr.h"
 #include "obj.h"
-
-/******************************************************************************/
-/* range                                                                      */
-
-typedef struct _mp_obj_range_t {
-    mp_obj_base_t base;
-    // TODO make these values generic objects or something
-    machine_int_t start;
-    machine_int_t stop;
-    machine_int_t step;
-} mp_obj_range_t;
-
-STATIC mp_obj_t range_getiter(mp_obj_t o_in) {
-    mp_obj_range_t *o = o_in;
-    return mp_obj_new_range_iterator(o->start, o->stop, o->step);
-}
-
-STATIC const mp_obj_type_t range_type = {
-    { &mp_type_type} ,
-    .name = MP_QSTR_range,
-    .getiter = range_getiter,
-};
-
-// range is a class and instances are immutable sequence objects
-mp_obj_t mp_obj_new_range(int start, int stop, int step) {
-    mp_obj_range_t *o = m_new_obj(mp_obj_range_t);
-    o->base.type = &range_type;
-    o->start = start;
-    o->stop = stop;
-    o->step = step;
-    return o;
-}
+#include "runtime.h"
 
 /******************************************************************************/
 /* range iterator                                                             */
@@ -75,3 +44,47 @@
     o->step = step;
     return o;
 }
+
+/******************************************************************************/
+/* range                                                                      */
+
+typedef struct _mp_obj_range_t {
+    mp_obj_base_t base;
+    // TODO make these values generic objects or something
+    machine_int_t start;
+    machine_int_t stop;
+    machine_int_t step;
+} mp_obj_range_t;
+
+STATIC mp_obj_t range_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
+    mp_check_nargs(n_args, 1, 3, n_kw, false);
+
+    mp_obj_range_t *o = m_new_obj(mp_obj_range_t);
+    o->base.type = &mp_type_range;
+    o->start = 0;
+    o->step = 1;
+
+    if (n_args == 1) {
+        o->stop = mp_obj_get_int(args[0]);
+    } else {
+        o->start = mp_obj_get_int(args[0]);
+        o->stop = mp_obj_get_int(args[1]);
+        if (n_args == 3) {
+            o->step = mp_obj_get_int(args[2]);
+        }
+    }
+
+    return o;
+}
+
+STATIC mp_obj_t range_getiter(mp_obj_t o_in) {
+    mp_obj_range_t *o = o_in;
+    return mp_obj_new_range_iterator(o->start, o->stop, o->step);
+}
+
+const mp_obj_type_t mp_type_range = {
+    { &mp_type_type },
+    .name = MP_QSTR_range,
+    .make_new = range_make_new,
+    .getiter = range_getiter,
+};