Handle JSONDecodeError more gracefully

We're seeing a `JSONDecodeError` that likely comes from mis-handling a response that is sending an empty body, so we don't know how we got to this failure. This change catches the `JSONDecodeError` and adds the status code to the exception message so we can see exactly which status is coming through.