let-aliasing + removing let imps

First draft of proposal to remove implications from the let typing judgment (replaced by a logically equivalent or) and add aliasing for let-bindings where the expression being bound has an object (e.g. x, (car y), etc...).

This speeds up type checking (e.g. the 'filters-more' function from http://bugs.racket-lang.org/query/?cmd=view&pr=14838) and adds the ability to typecheck expressions that utilize simple let bindings of pure expressions, such as the following function:

#lang typed/racket

(: foo (Any -> Number))
(define (foo x)
  (match x
    [(? number?) x]))


The current implementation has 2 errors when running the unit tests at the moment, which relate to usages of types with '...' such as:

(let: ((f : (All (b ...) (Any ... b -> Any)) (lambda x (quote x)))) (lambda xs (apply f (quote y) xs)))

Obviously I need to work out these errors before this is pulled, but this is what it looks like at the moment, FYI.

In that case I need to talk about the original identifier (id) and the id it is aliased to (id^), so the ^ only serves to give me a different name.

That case is when the id we're looking at is being aliased *and* that alias is an id we possibly have not recorded the type of before. Without that second part (recording the type for the alias as well) we fail some typechecking that currently works. I didn't it was necc. originally but it turned out to be, so I added it.