Mark futures as cancelled

This allows callers to cancel futures without having to worry about
receiving a `ready` message if the future completes before the
cancellation is applied.

Its possible that a message for this already in the callers message
queue. In which case you can call `cancel(Future, [flush])` to remove
that message.
diff --git a/c_src/main.c b/c_src/main.c
index 7b935d8..16c3618 100644
--- a/c_src/main.c
+++ b/c_src/main.c
@@ -84,8 +84,10 @@
         caller = future->pid_env;
     }
 
-    msg = T2(future->msg_env, future->msg_ref, ATOM_ready);
-    enif_send(caller, &(future->pid), future->msg_env, msg);
+    if(!future->cancelled) {
+        msg = T2(future->msg_env, future->msg_ref, ATOM_ready);
+        enif_send(caller, &(future->pid), future->msg_env, msg);
+    }
 
     // We're now done with this future which means we need
     // to release our handle to it. See erlfdb_create_future
@@ -112,6 +114,7 @@
     f->pid_env = env;
     f->msg_env = enif_alloc_env();
     f->msg_ref = enif_make_copy(f->msg_env, ref);
+    f->cancelled = false;
 
     // This resource reference counting dance is a bit
     // awkward as erlfdb_future_cb can be called both
@@ -620,6 +623,7 @@
     }
     future = (ErlFDBFuture*) res;
 
+    future->cancelled = true;
     fdb_future_cancel(future->future);
 
     return ATOM_ok;
diff --git a/c_src/resources.h b/c_src/resources.h
index 798b22f..ead7b1c 100644
--- a/c_src/resources.h
+++ b/c_src/resources.h
@@ -47,6 +47,7 @@
     ErlNifEnv* pid_env;
     ErlNifEnv* msg_env;
     ERL_NIF_TERM msg_ref;
+    bool cancelled;
 } ErlFDBFuture;