Keep kind-inconsistent Given type equalities (fixes Trac #8705)

I was too eager when fixing Trac #8566, and dropped too many
equalities on the floor, thereby causing Trac #8705.

The fix is easy: delete code.  Lots of new comments!

(cherry picked from commit 89d2c048c81020a701ac94d949b4d6f1ced37cfa)
Allow ($) to return an unlifted type (Trac #8739)

Since ($) simply returns its result, via a tail call, it can
perfectly well have an unlifted result type; e.g.
    foo $ True    where  foo :: Bool -> Int#
should be perfectly fine.

This used to work in GHC 7.2, but caused a Lint failure.  This patch
makes it work again (which involved removing code in TcExpr), but fixing
the Lint failure meant I had to make ($) into a wired-in Id.  Which
is not hard to do (in MkId).

(cherry picked from commit 5dd1cbbfc0a19e92d7eeff6f328abc7558992fd6)
Use NoGen plan for unboxed-tuple bindings

There was a small mixup here, exposed by Trac #8762.
Now clarified with better function names and comments.

(cherry picked from commit 47f473b0f7ddf21b2cde825166d092cb6e72329d)
Revert "Add comments explaining #8754"

This reverts commit b626c3d4ce0e66216705ba8355c914dc809e3fe7.

(cherry picked from commit 642bba349fda1508aa136f7169c0ba63fb00a6f9)
Revert "Fix #8754 in a round-about way."

This reverts commit 5023c91780e90947680fe0640f7564a4f6448bea.

(cherry picked from commit e789a4f51b6205160a696e3e6e13ecefb5ae16f7)