Currently when you define a teardown

e.g. 

```
@teardown(on_failure_fail_dagrun=True)
def my_teardown():
    ...
```

You can not change this when you instantiate the task

e.g. with 

```
my_teardown.override(on_failure_fail_dagrun=True)()
```

I don't think this is good because if you define a reusable taskflow function then it might depend on the context.

if "return" not in self.function.__annotations__:
            
            return False
        try:
            
            def fake():
                ...
            fake.__annotations__ = {"return": self.function.__annotations__["return"]}
            return_type = typing_extensions.get_type_hints(fake, self.function.__globals__).get("return", Any)
        except NameError as e:
            warnings.warn(
                f"Cannot infer multiple_outputs for TaskFlow function {self.function.__name__!r} with forward"
                f" type references that are not imported. (Error was {e})",
                stacklevel=4,
            )
            return False
        except TypeError:  
            return False
        ttype = getattr(return_type, "__origin__", return_type)
        return ttype == dict or ttype == Dict
    def __attrs_post_init__(self):