I think we should ensure we don't get into any infinite loops.

What about adding an optional arg `tryingAgain` to `provision()`, with the default value `false`.  On this line, call `self.provision(true) ...`.  Only try again if `tryingAgain` is false.  Or it could be a countdown timer from 5 with progressive backoff each time.  But I think we should have some protection.