Improve type->contract error messages

This PR is for code review.

Here is an example of an improved `type->contract` error:

````
#lang typed/racket

(require/typed racket/base
               [values (case-> (String -> String)
                               (Integer -> Integer))])
````

````
Type Checker: Type (case-> (String -> String) (Integer -> Integer)) could not be converted to a contract: function type has two cases of the same arity
````

The error message notes the cause of the failure at the end. This should make debugging slightly easier (for both developers and users hopefully).

I haven't added error messages for all causes of failures, but it's easy to add new ones. Just find occurrences of `(exit (fail))` and replace with `(exit (fail #:reason "failure cause"))`.