Allow specifying a prefix for unpack and range

This pretty much removes any usefulness from `erlfdb_subspace` since
Erlang doesn't support operator overrides or other similar syntactic
sugar that makes subspaces useful in other languages.
diff --git a/src/erlfdb_tuple.erl b/src/erlfdb_tuple.erl
index b2dc893..46322d0 100644
--- a/src/erlfdb_tuple.erl
+++ b/src/erlfdb_tuple.erl
@@ -20,6 +20,7 @@
     pack_vs/2,
     unpack/1,
     range/1,
+    range/2,
     compare/2
 ]).
 
@@ -121,18 +122,33 @@
 
 
 unpack(Binary) ->
-    case decode(Binary, 0) of
-        {Elems, <<>>} ->
-            list_to_tuple(Elems);
-        {_, Tail} ->
-            erlang:error({invalid_trailing_data, Tail})
+    unpack(Binary, <<>>).
+
+
+unpack(Binary, Prefix) ->
+    PrefixLen = size(Prefix),
+    case Binary of
+        <<Prefix:PrefixLen/binary, Rest/binary>> ->
+            case decode(Binary, 0) of
+                {Elems, <<>>} ->
+                    list_to_tuple(Elems);
+                {_, Tail} ->
+                    erlang:error({invalid_trailing_data, Tail})
+            end;
+        _ ->
+            E = {erlfdb_tuple_error, invalid_unpack_prefix},
+            erlang:error(E)
     end.
 
 
 % Returns a {StartKey, EndKey} pair of binaries
 % that includes all possible sub-tuples
 range(Tuple) ->
-    Base = pack(Tuple),
+    range(Tuple, <<>>).
+
+
+range(Tuple, Prefix) ->
+    Base = pack(Tuple, Prefix),
     {<<Base/binary, 16#00>>, <<Base/binary, 16#FF>>}.