Change how the Authorize.net auto-discovery works.

This was precipitated by Authorize.net changing their response in the
sandbox for the wrong transaction ID.  We can no longer call
`retrieve('0')` to the sandbox API.  It was the favorite call because it
is idempotent and we don't have to worry about changing any data by
calling it, however it had some disadvantages, namely that the
Transaction Details API is not always enabled for every customer.  We
switched to voiding a non-existent transaction because that endpoint
should exist for every customer.

Additionally, the auto-discovery code has been moved out of `__init__`,
which means that the gateway URL isn't discovered at configure time, but
it also means that your entire application doesn't fail when you
Authorize.net decides to change their response codes.

I think we should keep this change even if Authorize.net fixes their API response.  The voidTransaction call should always work, even when the Transaction Detail API is disabled.