Make salt.utils.which look for a path with .exe on Windows

If the argument passed to this function does not end in .exe and the
minion is running Windows, look for the path + '.exe', allowing both
'cmd.exe' and 'cmd' to be matched.
Optimization for .exe path check

The majority of minions will be running a non-Windows OS, so this tweak
keeps salt.utils.is_windows() from being run unless the non-.exe path
check fails.
Merge pull request #8121 from terminalmage/issue7904

Make salt.utils.which look for a path with .exe on Windows
Move out htpasswd functions into webutil module
Merge pull request #8124 from techhat/webutils

Move out htpasswd functions into webutil module
Add unit test for salt.utils.which

This is a Linux-only test, it will need some mock love to make it
suitable to test for windows paths.
Provide a mocked version the tests to reach windows specific code.
Add some comments to explain whats going on.
Fix a the return from setting a rabbitmq users tag, this was failing
religiously due to the lack of tabs in the output.

Fix the documentation for the perms attribute (was permissions).

Fix the perms handling, as it is a list of dicts that is called in.
Merge pull request #8128 from asachs/develop

Fix setting rabbitmq users tags and permissions
Add unit test for salt.utils.which

This is a Linux-only test, it will need some mock love to make it
suitable to test for windows paths.
Merge branch 'features/mocked-which-test' of https://github.com/s0undt3ch/salt into s0undt3ch-features/mocked-which-test
Merge pull request #8129 from terminalmage/which-test

Add a test for salt.utils.which
Properly determine conf_dir

lstrip() strips each char independently. Not the whole string as a whole
Merge pull request #8130 from UtahDave/develop

Properly determine conf_dir
Add space to make pylint happy
Merge pull request #8131 from UtahDave/develop

Add space to make pylint happy
Use PATHEXT in salt.utils.which on Windows

Fixes #8125.
If there is no hit, don't log just return None
Tying tags and events to state files wasn't clear to me.
Also some typoes and escaping '*' chars.