Structured UpstreamError logging (review) 

Having an `UpstreamError` class that wraps all possible upstream system errors. It has `details` property that returns a `dict` of all contents in it. This `dict` is used when logging launch and delete failures. This has 2 benefits:
* The launch/delete failure messages will be short: `"Launching server failed: nova error: 403 - Not allowed to boot from requested image"` 
* The err log messages will have structured information that will allow error dashboards to be created easily. 
The bare except is a little unfortunate. I understand why, though; personally I'd throw in KeyError/IndexError (maybe TypeError) in there. If not that, then at least `except Exception:` so that we don't catch GeneratorExit, SystemExit, or KeyboardInterrupt.