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.