Improve error message for failed Spark API requests.

ResponseError values for failed Spark API requests will now include
the body of the error reponse in logged messages to make it easier to
debug problems.
Spark API shouldn't use an expired request token.

When we ask the server for a list of existing tokens, it will return
both valid and expired tokens (learned this the hard way).

We now check the expiration dates of all returned tokens, and only use
them if the are valid for a few more hours. The extra hours help
ensure no issues with special cases like daylight savings, or expiring
before we have a chance to use them the first time.

PS: REALLY need a way to mock out network interaction, so I can write
tests for this kind of interaction. Not solving that here.