this is a mess, but should be done to properly support tail recursion
(to allow old futures to be reclaimed and not chained)