##### SUMMARY
There is no real reason that `UnsafeProxy` needs to exist.  

We need to add unsafe bytes support, and by doing so within `UnsafeProxy` over complicates matters.

`wrap_var` should effectively take over the work that `UnsafeProxy` is doing, and then just rely on `wrap_var` directly using the proper `AnsibleUnsafe*` classes. Or callers can directly use `AnsibleUnsafe*` themselves when `wrap_var` isn't necessary.

##### ISSUE TYPE
- Feature Idea

##### COMPONENT NAME
lib/ansible/utils/unsafe_proxy.py

##### ADDITIONAL INFORMATION
<!--- Describe how the feature would be used, why it is needed and what it would solve -->

<!--- Paste example playbooks or commands between quotes below -->
```yaml

```

<!--- HINT: You can also paste gist.github.com links for larger files -->

if not isinstance(key, string_types):
            raise ValueError('key must be a string')
        key = to_native(key)
        if '.' not in key:  
            return self._delegatee.__getitem__(key)
        func = self._collection_jinja_func_cache.get(key)
        if func:
            return func
        components = key.split('.')
        if len(components) != 3:
            raise KeyError('invalid plugin name: {0}'.format(key))
        collection_name = '.'.join(components[0:2])
        collection_pkg = 'ansible_collections.{0}.plugins.{1}'.format(collection_name, self._dirname)
        
        
        pkg = import_module(collection_pkg)
        for dummy, module_name, ispkg in pkgutil.iter_modules(pkg.__path__, prefix=collection_name + '.'):
            if ispkg:
                continue
            plugin_impl = self._pluginloader.get(module_name)
            method_map = getattr(plugin_impl, self._method_map_name)
            for f in iteritems(method_map()):
                fq_name = '.'.join((collection_name, f[0]))
                self._collection_jinja_func_cache[fq_name] = f[1]
            function_impl = self._collection_jinja_func_cache[key]
        
        return function_impl
    def __setitem__(self, key, value):