OSError: [Errno 22] Invalid argument - caused by duplicate gids.

Currently, `supgroups` can return a list that has duplicate gids in it:
```python
>>> supgroups = [g.gr_gid for g in grp.getgrall() if uinfo.pw_name in g.gr_mem and g.gr_gid != uinfo.pw_gid]
>>> supgroups
[80, 29, 1, 2, 5, 9, 8, 20, 3, 4, 1, 2, 3, 4, 5, 8, 9, 20, 29, 80]
```

This cause problems in the comparison on [L80](https://github.com/saltstack/salt/blob/0.17/salt/modules/cmdmod.py#L80).  More importantly, it causes an OS error on [L82](https://github.com/saltstack/salt/blob/0.17/salt/modules/cmdmod.py#L82) when we attempt to `os.setgroups(supgroups)`.  Simply deduplicating the list before handling processing it fixes the issue.

Here's some debugging that should help you understand:
```python
>>> uinfo
pwd.struct_passwd(pw_name='root', pw_passwd='*', pw_uid=0, pw_gid=0, pw_gecos='System Administrator', pw_dir='/var/root', pw_shell='/bin/sh')
>>> [g.gr_gid for g in grp.getgrall()]
[83, 55, 87, 81, 79, 33, 67, 235, 97, 93, 32, 82, 202, 212, 72, 207, 59, 204, 220, 227, 56, 201, 25, 96, 84, 30, 211, 205, 26, 98, 100, 78, 54, 65, 74, 222, 228, 24, 209, 28, 27, 216, 76, 60, 203, 31, 92, 58, 200, 89, 75, 73, 13, 94, 210, 91, 208, 99, 95, 213, 66, 224, 221, 88, 70, 90, 80, 50, 7, 29, 401, 53, 1, 68, 12, 16, 51, 2, 61, 6, 62, 52, 69, 4294967294, 4294967295, 5, 10, 9, 8, 20, 3, 4, 45, 0, 2106269579, 4294967294, 4294967295, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 16, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 45, 50, 51, 52, 53, 54, 55, 56, 58, 59, 60, 61, 62, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 200, 201, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 216, 220, 221, 222, 224, 227, 228]
>>> supgroups = [g.gr_gid for g in grp.getgrall() if uinfo.pw_name in g.gr_mem and g.gr_gid != uinfo.pw_gid]
>>> supgroups
[80, 29, 1, 2, 5, 9, 8, 20, 3, 4, 1, 2, 3, 4, 5, 8, 9, 20, 29, 80]
>>> # Notice the duplication ...
...
>>> 
>>> os.getgroups()
[0, 1, 2, 3, 4, 5, 8, 9, 12, 20, 29, 61, 80]
>>> os.setgroups(supgroups)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
>>> type(supgroups)
<type 'list'>
>>> seen = set()
>>> supgroups_deduped = [ x for x in supgroups if x not in seen and not seen.add(x) ]
>>> supgroups_deduped
[80, 29, 1, 2, 5, 9, 8, 20, 3, 4]
>>> os.setgroups(supgroups_deduped)
>>> os.getgroups()
[0, 1, 2, 3, 4, 5, 8, 9, 12, 20, 29, 61, 80]
```

Solution gleened from:
http://stackoverflow.com/a/480227/615422

```sh
# /usr/local/bin/salt-minion --versions-report
           Salt: 0.16.3
         Python: 2.7.2 (default, Oct 11 2012, 20:14:37)
         Jinja2: 2.7.1
       M2Crypto: 0.21.1
 msgpack-python: 0.3.0
   msgpack-pure: Not Installed
       pycrypto: 2.6
         PyYAML: 3.10
          PyZMQ: 13.1.0
            ZMQ: 3.2.3
```
OS X 10.8.4
Modify socket delletion to handle minor api change in pyzmq 14
Add another sticky bit
Fix parsing
Add key_auto deploy more correctly
fix for issue #7436 no templates in salt

One line in setup.py that says salt.templates package should be build.
Dereferenced symbolic links when creating thin.tgz
Pass through the env to file.patch state

Fixes #7452.
updated suse spec to salt 0.17.0

created salt-ssh as a separate package
improved dependencies per package
salt-master depends pyzmq and recommends halite
salt-minion depends pyzmq
salt dependency pyzmq removed.
client/ssh/wrapper/config.py: rm unused import of urllib2

************* Module salt.client.ssh.wrapper.config
salt/client/ssh/wrapper/config.py:9: [W0611(unused-import), ] Unused import urllib2
Add packaging convention document
Add "available" functions to service providers

These functions make service states more reliable, and and fix edge
cases when a provider override is used and the the overriding provider
doesn't have an available function (and this falls back to using the
default one from the detected service module).
Fix reporting for service.dead states

service.dead states for which the "enable" param is not set to True or
False, if a service is stopped as a result of running the state, did not
have anything in the changes dict, and also had an empty comment field.
This commit improves those reporting deficiencies.

In addition, the helper function _available() in salt/states/service.py
has been modified slightly. There is no reason to add a key to the
return dict, then pop it off after running _available(). This has been
changed so that _available() returns True/False, and the refs to this
function have been changed to not pop the now-nonexistant key from the
return dict.
Fix minor documentation bug in states.mount.unmount
copyedit SaltStack Packaging Guide
minor typo
Add salt-call to salt-common package
Updated the salt-ssh.rst to add the new options that are available via the command line. Modified the ssh index.rst to include a link to the salt-ssh cli commands page. Updated parsers.py to fix the default value that is present in the documentation from 5 to 25 (as 25 is the actual default). Updated roster.rst to note that the default file location is /etc/salt/roster since it was absent, and might be confusing if you head to the roster documentation before reading the rest of the salt-ssh documentation.
Add --ssh-priv option to SaltSSHOptionParser
Shorten --ssh-priv option to --priv