Refactor Future to track its state explicitly

Instead of @resolved and @failed.
Avoid taking locks in resolved and failed Futures

When a Future's state can be seen as not pending we don't need to take the lock to read @value and @error, because we (should) be guaranteed to have seen the writes to those variables.

This makes #value, #on_value and the other read paths approximately 3x faster than when taking a lock.
Change from Mutex#synchronize to #lock/#unlock in Future

It's around 40% slower because of the block.
Change from Mutex#synchronize to #lock/#unlock in BaseConnection and IoReactor
Version bump to v1.1.3.pre0