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.
This comment is misleading. It suggests the non-null pointer is purely because of 0-sized types (not 0-sized vectors!), but one would expect a `size_of()` test in that case. It should be rewritten to explain that Slice wants to never have a null pointer so it can benefit from null pointer optimization, and the easiest way to do that is to make Vec never have a null pointer.