Python bindings: make all IBA functions release the GIL for their expensive part

The notorious GIL (global interpreter lock) prevents other Python threads from executing while our functions are holding the lock.

We use a ScopedGilRelease found in many places on the web. Its purpose is to release the GIL before expensive work, then properly re-acquire it again when it exists scope. This allows other Python threads to advance while we are doing the meat of our work.

In many case, this meant writing a wrapper (to scope the GIL business) where before we did not need a wrapper.