pybind: simplify timeout handling in run_in_thread()
* no need to poll for thread exit, instead just use the timeout
parameter of Thread.join()
* raise Exception("timed out") if times out
* do not catch KeyboardInterrupt in run_in_thread(), let
the upper caller to take care of it. as run_in_thread()
should always return the *retval* of the function, not a tuple
representing an exception or failure.