Opportunistic locking

x::vipobj::readlock, x::vipobj::writelock, x::vipobj::updatelock, and x::vipobj::handlerlock all take the very important template object as their sole required parameter. Their constructor blocks until it acquires the necessary locks.

Passing false as an optional second parameter results in an opportunistic locking attempt. An exception gets thrown immediately if the lock cannot be acquired.