Fix exclusive lock and unlock.

Two problems with exclusive lock contention.

Because exclusive locks are not reentrant, there was an assertion to
check that an exclusive lock was not requested when one was already
outstanding, however that outstanding lock could be held by a separate
descent, which is the way it's suppposed to be.

Unlock shifted the top most queue of locks, but if the top most queue is
an exclusive lock and there only lock waiting is another exclusive lock,
then the shared queue will have no continuations, the program will
stall. The if statement in `unlock` has been replaced by a while loop.

Closes #64.