Task-based prompt execution for interactive sessions.
@type ask_fun() :: (String.t(), keyword() -> {:ok, term()} | {:error, term()})
@spec cancel(pid() | nil, pid() | nil) :: :ok
@spec default_ask( String.t(), keyword() ) :: {:ok, term()} | {:error, term()}
@spec safe_ask(ask_fun(), String.t(), keyword()) :: {:ok, term()} | {:error, term()}
@spec start(ask_fun(), String.t(), keyword(), pid(), reference()) :: {:ok, pid()}