~~I made `VoidTag` so i can use `std::optional<HandleVoid<ResultType>>` for any result.
Another solution would be `std::optional<std::tuple<>>` for void results and `std::optional<std::tuple<ResultType>>` for non void results.~~
~~There is no empty base class optimization anymore.
Probably the state of the optional can in the future be used do differentiate `done` and `canceled`.~~