Merge pull request #3 from JPMoresmau/master

Choose currency, expiration date parsing
Whitespace.
Use throwIO in order to enforce ordering of exceptions.

@JPMoresmau, this commit restores your sanity :).

The reload seems to be a behaviour of the browser.  Since the connection
is reset abruptly, it tries to connect again.  (Tested on Firefox 28.0.)

I didn't dig deeply enough to know for sure exactly how the exception
was propagating, but here is my hypothesis:

  - `storeCardRegistration` fails.

  - Since you effectively were using `return (throw exc)`, the whole
    `runYesodMPTToken` block returned successfully.

  - However, `cr2` was set to bottom due to `throw`.

  - The value of `cr2` isn't forced anywhere inside `getCardR`.  A thunk
    is created with it inside but `setSession` does not force it.  The
    whole `getCardR` code gets executed succesfully.

  - Somewhere inside Yesod's response code the session needs to be
    forced and, BAM!, `cr2` finally explodes and Yesod can't handle it.

  - Connection is reset, browser tries again.

BTW, while I appreciate fixing this bug, I wonder why you wrote catchW
for the test app.  The default Yesod ISE page already displays the same
information.  Did you do it because you weren't seeing the ISE page due
to the bug above?

Finally, it *may* be possible to fix this issue by using `return $!
throw exc`, but I prefer using `throwIO` whenever possible.
log data being posted too, since a lot of errors come from incorrect
input data