User-defined placement-box

Add support for user-defined placement-box expressions (i.e. `box (<place>) <value>` for types other than `Box<T>`).

This is a prototype design that @nikomatsakis and @pnkfelix have been working on.  It works by desugaring an instance of placement-box into a protocol where we first create the intermediate storage with a pseudo-out-pointer, then initialize the storage, and then convert the out-pointer into the desired box type.

The code was originally written to handle both `box (<place>) <value>` and `box <value>` via the same uniform desugaring, and it is easy to revise support for the latter; but as is, this PR only puts `box (<place>) <value>` into the desugaring.  The reason for this is that the error messages get a lot nastier to handle from the desugared form, and pnkfelix did not want to hold this work up further trying to resolve that.

The final design for this will require an RFC; this code is entirely experimental for now.
heap::allocate() can return null on failure, we should check for this and panic