py: Make globals and locals proper dictionary objects.

Finishes addressing issue #424.

In the end this was a very neat refactor that now makes things a lot
more consistent across the py code base.  It allowed some
simplifications in certain places, now that everything is a dict object.

Also converted builtins tables to dictionaries.  This will be useful
when we need to turn builtins into a proper module.
diff --git a/py/runtime.h b/py/runtime.h
index 6b3ab73..a627fa5 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -9,10 +9,10 @@
 
 void mp_check_nargs(int n_args, machine_uint_t n_args_min, machine_uint_t n_args_max, int n_kw, bool is_kw);
 
-mp_map_t *mp_locals_get(void);
-void mp_locals_set(mp_map_t *m);
-mp_map_t *mp_globals_get(void);
-void mp_globals_set(mp_map_t *m);
+mp_obj_dict_t *mp_locals_get(void);
+void mp_locals_set(mp_obj_dict_t *d);
+mp_obj_dict_t *mp_globals_get(void);
+void mp_globals_set(mp_obj_dict_t *d);
 
 mp_obj_t mp_load_name(qstr qstr);
 mp_obj_t mp_load_global(qstr qstr);