Apply various optimizations to the implementation

* Use a loop instead of recursion
* Try to emit as little drop glue as possible
* Ensure that some common things always get inlined
Rewrite basic operations with fewer moves/matches

* Far less `get_mut_ref` or movement out of `self.root`
* Alter `splay` to taking/returning a node to taking a mutable pointer to a node