Issue title: Make jinja really language indepened -> remove Hardcoded `Markup` and references
 Issue body: As described in #1377 I found that surprisingly Jinja hardcoded the usage of the `Markup` class quite deeply, i.e. to mark code as safe.

I would like to try to remove the hardcoded dependency, without changing the current behaviour.

My idea would be to replace all `escape` usage and `Markup` class generations by a function that is generated by the context and add a default MarkupClass generator to the environment for the Marco generation (only special case I found in the source code for which the context is not guaranteed and no html is considered anyway (i.e. `htmlsafe_json_dumps` or `generate_lorem_ipsum` with `html` parameter).

Also I would try to create a Protocol for the Markup class so people that want to create a custom one know which functions/operators are actually used by jinja.

What do you think about the idea? 

 Comments: 
 Comment 0: Addressed this in #1377
{'source': 'GithubIssues', 'repo_name_with_owner': 'pallets/jinja', 'issue_id': 849985622, 'repo_stars': 8842.0}