py: Implement float and complex == and !=.

Addresses issue #462.
diff --git a/py/obj.c b/py/obj.c
index 623b396..7b8be58 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -149,40 +149,28 @@
         if (MP_OBJ_IS_SMALL_INT(o1) && MP_OBJ_IS_SMALL_INT(o2)) {
             return false;
         } else {
-            if (MP_OBJ_IS_SMALL_INT(o2)) {
-                mp_obj_t temp = o1; o1 = o2; o2 = temp;
+            if (MP_OBJ_IS_SMALL_INT(o1)) {
+                mp_obj_t temp = o2; o2 = o1; o1 = temp;
             }
-            // o1 is the SMALL_INT, o2 is not
-            mp_small_int_t val = MP_OBJ_SMALL_INT_VALUE(o1);
-            if (o2 == mp_const_false) {
-                return val == 0;
-            } else if (o2 == mp_const_true) {
-                return val == 1;
-            } else if (MP_OBJ_IS_TYPE(o2, &mp_type_int)) {
-                // If o2 is long int, dispatch to its virtual methods
-                mp_obj_base_t *o = o2;
-                if (o->type->binary_op != NULL) {
-                    mp_obj_t r = o->type->binary_op(MP_BINARY_OP_EQUAL, o2, o1);
-                    return r == mp_const_true ? true : false;
-                }
-            }
-            return false;
+            // o2 is the SMALL_INT, o1 is not
+            // fall through to generic op
         }
     } else if (MP_OBJ_IS_STR(o1) && MP_OBJ_IS_STR(o2)) {
         return mp_obj_str_equal(o1, o2);
-    } else {
-        mp_obj_base_t *o = o1;
-        if (o->type->binary_op != NULL) {
-            mp_obj_t r = o->type->binary_op(MP_BINARY_OP_EQUAL, o1, o2);
-            if (r != MP_OBJ_NULL) {
-                return r == mp_const_true ? true : false;
-            }
-        }
-
-        nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NotImplementedError,
-            "Equality for '%s' and '%s' types not yet implemented", mp_obj_get_type_str(o1), mp_obj_get_type_str(o2)));
-        return false;
     }
+
+    // generic type, call binary_op(MP_BINARY_OP_EQUAL)
+    mp_obj_type_t *type = mp_obj_get_type(o1);
+    if (type->binary_op != NULL) {
+        mp_obj_t r = type->binary_op(MP_BINARY_OP_EQUAL, o1, o2);
+        if (r != MP_OBJ_NULL) {
+            return r == mp_const_true ? true : false;
+        }
+    }
+
+    nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_NotImplementedError,
+        "Equality for '%s' and '%s' types not yet implemented", mp_obj_get_type_str(o1), mp_obj_get_type_str(o2)));
+    return false;
 }
 
 machine_int_t mp_obj_get_int(mp_obj_t arg) {