Fixed bug in sl_impl::find_first which would compare with uninitialised values at the head and tail of the list. Also added unit tests to check this, using a type with a magic value that's set in the constructor.
Exposed and tested lower_bound and upper_bound for plain skip_list (no duplicates), where they work analogously to the corresponding methods in std::set.
Changed approach to providing a non-modifiable iterator - now typedefs both iterator and const_iterator to the underlying const_iterator implementation, in line with how std::set is implemented (on the Mac at least). Paves the way for a truly non-const iterator in a future skip_list_map class.
Fixed definition of iterators to be more consistent with the standard library.
Generalised the skip list implementation to allow for a distinction between keys and value, along the lines of how std::set/map are organised with their underlying tree. This paves the way for a skip_list_map implementation.
Added missing REQUIRE to unit test to silence a compiler warning.
Silenced a few 'unused variable' compiler warnings.
Moved implementation details from skip_list.h to detail
 header, so they can be shared by another similar type.
Moved some functionality from skip_list down into sl_impl so that it can be re-used by other classes (i.e. the proposed skip_list_map).
Added a skip_list_map re-using the same implementation as skip_list but providing a separate key and value, wrapped in a std::pair much like std::map.