librustc: Apply null pointer optimization to slices, closures & trait objects.

Extend the null ptr optimization to work with slices, closures, procs, & trait objects by using the internal pointers as the discriminant.

This decreases the size of `Option<&[int]>` (and similar) by one word.
As commented above, I think this should return null instead of a sentinel, and the Slice creation should instead do the null-test, but if you do keep the current behavior, it should at least return the *same* sentinel that `as_ptr()` does.