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.