Refactor TR `define` to avoid a performance bug

After commit 3d177e454ea3634060a4b9b0814f588bc7c74e49
running the main `math.scrbl` file would show peak memory
usage of around 600-700MB when before it was around 400MB.

The proximal cause appears to be the expansion of TR
definitions, which added an extra `begin` in some cases,
combined with redefinitions at the top-level. I don't
know the core cause yet.

Thanks to Matthew for pointing out the issue and to
Vincent for helping with debugging.
add some error checking for when reading in the content of files
Real fix for the issue in the math docs

Commit 92b0e86ed1cf0270730c004211387b3fdc4b0469 turns
out to have been the wrong approach, because there was no mysterious
performance problem with TR. Instead, TR's `define` expanded to new
code that interacted poorly with a macro used in the math docs.

I've kept the refactoring from that commit because I think it still
makes the code clearer, but I've removed the now extraneous comment.
Checkpoint
Replaced plot's 3D depth sort hack with a BSP tree

The following should look as expected now:

 * Intersecting or adjacent surfaces, isosurfaces, lines and paths,
   even if they're sampled at different intervals.

 * Rectangles that aren't spaced regularly on the x,y plane (e.g.
   sideways histograms; the rectangles I plot to debug Dr. Bayes).

In general, the rendering should be robust enough to draw arbitrary
3D scenes, and it still produces high-quality PDFs.

Drawing 3D plots still has the same time complexity and seems to be
about as fast as before. Thanks to the fact that sorting objects by
view distance is an O(n) BSP tree walk, rotating 3D plots in
DrRacket is probably a little faster.

This update also adds direct support for connected lines, and
includes a fix that makes contour lines easy to see, even when
plotted on top of a non-contour-interval surface. (This wasn't
possible before.) Further, the 3D plot area no longer requires a
"grid center" vertex by which to sort grid-aligned shapes, making
the rendering API friendlier, and closer to ready for public use.
fix extra message on timeouts

and division by 0 that caused null results to not save
refactor benchmark loops for clarity
Changed let-poly's unification algorithm
to be simpler and clearer

This caused bug #6's counterexample to change
because the unification algorithm no longer calls
∨ so we have to find a different way to call it
Fix TR docs for the addition of typed/racket/class
racket/gui mac os x: fix compatible-bitmap scale on slow path
fix problem with @2x bitmaps on Mac OS X 10.5
module: disallow definition skipping

Invoking a non-composable, empty continuation during the right-hand
side of a variable definition skips the definition --- while continuing
the module body. The compiler assumes, however, that variable references
later in the module do not need a check that the variable is undefined.
Fix that mismatch by changing `module` to double-check that defined
variables are really defined before continuing the module body.
(The check and associated prompt are skipped in simple cases, such as
function definitions.)

A better choice is probably to move the prompt to the right-hand
side of a definition, both in a module and at the top level. That's
a much different language, though, so we should consider the point again
in some future variant of Racket.

Closes PR 14427
Add smart constructors for Result and tc-result.
Use filters when typechecking using tc-body.

Closes PR 11920.
Add some HISTORY lines for TR 6.0.1.
adjust let poly bug #4 so that the check procedure catches
errors and treats them as failing to satisfy the property

This bug disables the occurs check and, thanks to the now
tighter contracts on the uh function, this can cause it to
signal an error. Here's the example:

  (term (unify (x → (list int)) ((list x) → x)))

found by in-order enumeration (so naturally it had ||
variables in it, not 'x's originally)

This leads to this trace in the uh function:

  (uh ((x → (list int)) ((list x) → x) ·) ·)
  (uh (x (list x) ((list int) x ·))       ·)
  (uh ((list int) (list x) ·)             (x (list x) ·))
  (uh (int x ·)                           (x (list x) ·))
  (uh (x int ·)                           (x (list x) ·))
  (uh ·                                   (x int (int (list int) ·)))

whereby the third step sets up a problem (that's where the
occurs check should have aborted the program) but instead, a
few steps later when we get a substitution for 'x', it
causes the second argument to not have the form of
variables-for-types substitution.

I don't think this can happen when the occurs check is in place
because the variable elimination step makes sure that we don't
set ourselves up to change the domain of anything in the second
argument to 'uh' (except possibly when the occurs check fails,
of course).

Here's an example that shows this:

 (unify (q → q) (y → int)))
 (uh ((q → q) (y → int) ·) ·)
 (uh (q y (q int ·))       ·)
 (uh (y int ·)             (q y ·))
 (uh ·                     (y int (q int ·)))

In the second to last step we don't have (q int ·), we have
(y int ·) because the variable elimination step changes the
q to a y.
print out check's input on exceptions
Faster, more precise detection of separating hyperplanes in BSP tree build

The new method finds bounding planes for polygons using their
(approximate) normals and works for any number of them instead of
just two. The algorithm is O(n^2) where n is the number of polygons,
so it is currently applied only when n <= 5; i.e. near the leaves.
BSP tree type simplified; added support for no-polygon scenes

Previously, the BSP type had a "negative" and "positive" subtree, and
a collection of unsorted "zero" (on the plane) shapes. Rather than "zero"
being a subtree (which would sort the shapes), it's rolled into "positive",
with corresponding changes to the BSP walk.

BSP tree build now supports scenes without polygons, though it does split
on polygonal planes first. When all such splits fail (usually because there
are no polygons, but might be because all the shapes lie on one polygon's
plane), it tries splitting on planes containing line segments. When that
fails (usually because there are no line segments), it tries splitting
disjointly on all remaining vertexes, then splitting at the midpoint of
the longest axis.

Upshot: it'll draw a double helix created by two `parametric3d' renderers
properly.
Reduce point3d rendering time by 50-70% by keeping points grouped

The old depth sort hack split up groups of identical points in order
to sort them. Now the BSP tree build keeps them grouped, only splitting
groups of points as needed. Drawing parameters like color and pen
width are set only once for each group instead of once for each point.
The speedup is from reducing the number of calls to set them.