Future improvements

Improves the `Future` specs, removes some unnecessary uses of `.tap` and adds `Future#then`.

`Future#then` is like a mix between `Future#map` and `Future#flat_map`. The primary use case is when you don't know until you see the value if you want to synchronously transform the value or make another asynchronous operation, for example:

```ruby
f = asynchronously_load_something
f = f.then do |result|
  if result.empty?
    asynchronously_load_some_fallback_value
  else
    result
  end
end
```