Declare Future::recover more safely

SFINAE through a default template parameter may not work as expected
when the user (erroneously) passes the defaulted parameter to the
template. Such an error can be avoided by SFINAE through return type.
Add SharedFuture class template