Potential unsafe behaviour when cancelling Future
Consider following simplified scenario:

```
import
  chronos

type SomeResourceWhichNeedToBeReleased = object

proc freeResource(res: SomeResourceWhichNeedToBeReleased): void = discard

proc use(res: SomeResourceWhichNeedToBeReleased): void= discard

proc allocateResource: Future[SomeResourceWhichNeedToBeReleased] = discard

proc someProcWhichUsesResource: Future[void] {.async.} =
  let resource = await allocateResource()
  try:
    resource.use()
  finally:
    resource.freeResource()

proc someProcWhichStartAndCancel() {.async.} =
  let fut = someProcWhichUsesResource()

  fut.cancel()
```

What we have been seeing sporadically in fluffy is the following:

1. When calling `fut.cancel()`, the path with the [child](https://github.com/status-im/nim-chronos/blob/master/chronos/asyncfutures2.nim#L287) was taken where child future is `allocateResource` future (and the parent future is `someProcWhichUsesResource`)
2. But child future have already finished but not yet given control to the corresponding yield statement, so child cancel returns [false](https://github.com/status-im/nim-chronos/blob/master/chronos/asyncfutures2.nim#L284). So before cancel return, only the flag `mustCancel` on cancelled future is set to [true](https://github.com/status-im/nim-chronos/blob/master/chronos/asyncfutures2.nim#L295)
3. In the next eventLoop step control is given to the yield statement in `await allocateResource()` [yield](https://github.com/status-im/nim-chronos/blob/master/chronos/asyncmacro2.nim#L274), as the child future already finished (`allocateResource` future is child of `someProcWhichUsesResource` future ). As this child future already finished and not cancelled, resource was already allocated so to clean it up, call to `freeResource` is needed.
4. But as `mustCancel`  was set to true in point `2` for parent future, `await` actually throws a cancellation [exception](https://github.com/status-im/nim-chronos/blob/master/chronos/asyncmacro2.nim#L287) 
5. So it leads to the situation that there is no way to release resources allocated by `allocateResource` function

So my questions here are:
1. Can `allocateResource` do something to make sure resource will be released in such scenario ?
2. Or maybe it is just a bug and actually `mustCancel` should not be set  `true` in case when child future already finished, so the control will go back to parent future and not exception will be thrown ? (i.e if [this](https://github.com/status-im/nim-chronos/blob/master/chronos/asyncfutures2.nim#L287) return false keep `mustCancel = false`)