Fix issues with garbage collection.

* Refs became atoms to make sure they can live across calls
  to the NIF functions.
* Initialized curr in decode so that I'm no longer pushing
  random values into the Erlang VM.
diff --git a/c_src/decoder.c b/c_src/decoder.c
index 16effd6..9822d66 100644
--- a/c_src/decoder.c
+++ b/c_src/decoder.c
@@ -633,7 +633,7 @@
     ErlNifBinary bin;
 
     ERL_NIF_TERM objs = enif_make_list(env, 0);
-    ERL_NIF_TERM curr;
+    ERL_NIF_TERM curr = enif_make_list(env, 0);
     ERL_NIF_TERM val;
     ERL_NIF_TERM ret;
 
diff --git a/c_src/encoder.c b/c_src/encoder.c
index 37dc822..1238cd7 100644
--- a/c_src/encoder.c
+++ b/c_src/encoder.c
@@ -364,7 +364,7 @@
         return enif_make_badarg(env);
     }
 
-    stack = enif_make_list1(env, argv[0]);
+    stack = enif_make_list(env, 1, argv[0]);
 
     while(!enif_is_empty_list(env, stack)) {
         if(!enif_get_list_cell(env, stack, &curr, &stack)) {
diff --git a/c_src/jiffy.c b/c_src/jiffy.c
index 13e2979..fd67e62 100644
--- a/c_src/jiffy.c
+++ b/c_src/jiffy.c
@@ -15,8 +15,9 @@
     st->atom_false = make_atom(env, "false");
     st->atom_bignum = make_atom(env, "bignum");
 
-    st->ref_object = enif_make_ref(env);
-    st->ref_array = enif_make_ref(env);
+    // Markers used in encoding
+    st->ref_object = make_atom(env, "$object_ref$");
+    st->ref_array = make_atom(env, "$array_ref$");
 
     *priv = (void*) st;