Rework synchronization for blob's state machine, effectively unbreaking on OpenBSD

Rework synchronization around a state machine instead of trying to treat
mutexes and condition variables like semaphores.  Should reduce the
low-level locking operations and eliminates the attempt to lock a mutex in
one thread but unlock it another that violates POSIX requirements.

https://bugzilla.gnome.org/show_bug.cgi?id=734010