**Description**

Allow custom executors subclassed from existing (CeleryExecutor, CeleryKubernetesExecutor, etc.) to use default CLI commands to start workers or flower monitoring.

**Use case / motivation**

Currently, users who decide to roll their own custom Celery-based executor cannot use default commands (i.e. `airflow celery worker`) even though it's built on top of existing CeleryExecutor. If they try to, they'll receive the following error: `airflow command error: argument GROUP_OR_COMMAND: celery subcommand works only with CeleryExecutor, your current executor: custom_package.CustomCeleryExecutor, see help above.`

One workaround for this is to create custom entrypoint script for worker/flower containers/processes that are still going to use the same Celery app as CeleryExecutor. This leads to unnecessary maintaining of this entrypoint script.

I'd suggest two ways of fixing that:

- Check if custom executor is subclassed from Celery executor (which might lead to errors, if custom executor is used to access other celery app, which might be a proper reason for rolling custom executor)
- Store `app` as attribute of Celery-based executors and match the one provided by custom executor with the default one

**Related Issues**

N/A
tests/cli/test_cli_parser.py
with conf_vars({('core', 'executor'): 'SequentialExecutor'}), contextlib.redirect_stderr(
            io.StringIO()
        ) as stderr:
            parser = cli_parser.get_parser()
            with self.assertRaises(SystemExit):
                parser.parse_args(['celery'])
            stderr = stderr.getvalue()
        assert (
            "airflow command error: argument GROUP_OR_COMMAND: celery subcommand "
            "works only with CeleryExecutor, your current executor: SequentialExecutor, see help above."
        ) in stderr
    @parameterized.expand(["CeleryExecutor", "CeleryKubernetesExecutor"])
    def test_dag_parser_celery_command_accept_celery_executor(self, executor):
        with conf_vars({('core', 'executor'): executor}), contextlib.redirect_stderr(io.StringIO()) as stderr:
            parser = cli_parser.get_parser()
            with self.assertRaises(SystemExit):
                parser.parse_args(['celery'])
            stderr = stderr.getvalue()
        assert (
            "airflow celery command error: the following arguments are required: COMMAND, see help above."
        ) in stderr
    def test_dag_parser_config_command_dont_required_celery_executor(self):
        with conf_vars({('core', 'executor'): "CeleryExecutor"}), contextlib.redirect_stderr(
            io.StringIO()
        ) as stdout:
            parser = cli_parser.get_parser()
            parser.parse_args(['config', 'get-value', 'celery', 'broker-url'])
        assert stdout is not None