As mentioned above needing to pass kwargs to acquire makes this signature pretty messy.

Maybe it should also take a lock instance instead, if everything is configured on the lock this means no acquire keyword arguments _and_ it'll work with AdvancedLock later?

`call_with_lock(lock, func, *args, **kwargs)`