Problem: node insert/delete code is clumsy

In fact a doubly-linked list is easy to work with if you always initialize
a new node to point to itself. Then, inserting and removing a node is the
same operation (swap pointers with prev/next nodes). As we're doing this in
a few places, and it's the most tricky area of such code, it's worth doing
right.

Solution: do it right using a s_node_relink method.

Problem #2: inner loop check on self->comparator is clumsy and unnecessary.

Solution: define a default comparator so this test can disappear.
Fixed whitespace weirdness from restyling
Problem: need methods to move items to start/end

This is necessary for timers, which I'm improving in zproto/server.

Solution: zlistx_move_end/zlistx_move_start methods with optional
"move into place" sorting.

Incidentally, fixed major bug in sort algorithm. Lesson here is
"do not trust Wikipedia" (the bug was copied from a deliberate(?)
error introduced into the combsort pseudocode).