Just checks the value of the current node against value, assesses if
the leaf it needs to store it in is a NULL or not, then either
allocates to that leaf or recursively calls insert on that leaf (so it
may sort the value). Uses pointer magic for some cleaner code.
Has a custom enum for ordering, as each type of data may have its own
comparator system. Hence, each node will have a comparison function
pointer internally. Though this increases the data required to create
a binary tree, it does make it easier to support multiple types.