add test for invalid URL passed to NewRequest

also add specific error type checking for invalid JSON test
don't use http.Error with empty response bodies

internally, http.Error uses fmt.Fprintln() which will append a newline
to what should be an empty response body.  In one of my previous tests,
this was causing spurious errors.  I've since rewritten that test, but
still best to avoid it here.
drop errors caused from reading error response body

if we have an error reading the body of an API error response, still
return an ErrorResposne with the original response struct.  Simply
returning a string stating that we couldn't read the response body
doesn't give the caller anything actionable to work with or attempt to
process.
add test for internal http client's Do() func