Implementation of IVar

This is the last feature I want to pull in before the next release (we'll leave `TVar` and STM until the next release as a proper implementation is relatively complicated).

This implements `IVar`. They're like `Future`, expect you assign them directly rather than assigning them in a concurrent task. This decouples the task from the variable. We then redefine `Future` in terms of `IVar`.

`IVar` replaces `Contract`, which was basically the same thing but didn't seem to be synchronized.