Handle JSON error responses in BotoServerError.

Attempts to fix services which may return JSON error responses. For example,
CloudFormation might return something like:

```json
{
  "Error": {
    "Code": "ValidationError",
    "Message": "Template error: Unable to get mapping for RegionMap::us-west-2::AMI",
    "Type": "Sender"
  },
  "RequestId": "xxxxxx-xxxxx-xxxxx"
}
```

The error, when represented as a string looks like:

```python
boto.exception.BotoServerError: BotoServerError: 400 Bad Request
None
```

After this fix, the `None` is replaced with the response body, and the
`BotoServerError.[request_id|error_code|message]` values are filled in.
Add test for error attributes
Merge pull request #2113 from danielgtaylor/json-error

Handle JSON error responses in BotoServerError. Fixes #2113, #2077.