Fix incorrect assert_redirected_to failure message

`assert_redirected_to` returns incorrect and misleading failure messages in certain scenarios. The assertion itself is correct, but when there is a failure, it calculates the URLs to use in the messages differently than `redirect_to` calculates the actual url. This is most easily seen with protocol relative URLs.

The underlying cause was duplication and eventual divergence of the code used to calculate the redirect url from options. This change centralizes that code in ActionController::Redirecting.

The change also revealed that the regular expression previously used in ActionController::Redirecting was too permissive in that it was allowing `_` in schemes. This has also been addressed.

Left as three commits for now to make for an easier review.