Helpers for mutating non-copyable types

Because it is not possible to 'un-move' moved values, certain legal operations cannot be performed. This patch uses unsafe code to enable these operations on non-copyable types.

This adds support for 3 types of assignments:
```rust
x = func(x)
x = comb(x, y)
(x, y) = split(x)
```

The reason I want to add these things is for code like the following:
```rust
use std::util::{pack, unpack}

enum OwnList<T> {
    OwnCons(T, ~OwnCons),
    OwnNil()
}

impl<T> OwnList<T> {
    fn push(&mut self, item: T) {
        do pack(self, item) |l, i| {
            OwnCons(i, ~l)
        }
    }
    fn pop(&mut self) -> Option<T> {
        do unpack(self) |l| {
            match l {
                OwnCons(item, next) => (*next,  Some(item)),
                OwnNil()            => (OwnNil, None)
            }
        }
    }
}
```