Versioned formula reqs manager

This is a replacement for gitfs in salt.

It reads the formulas and versions of them from a formula-requirements.txt in the root of the deploy repo.

To use it you need three changes. The first should go before you rsync the code up - this manages the files locally.

```python
from cotton.salt_shaker import Shaker
shaker = Shaker(root_dir=os.path.dirname(fab_env.real_fabfile))
shaker.install_requirements()
```

Next you need to make sure this managed directory (`vendor/_root`) is rsynced to your salt master. extra_opts says to copy what the symlinks point to, not the symlink itself (which would point to a directory that doesn't exist on the server).

```python
smart_rsync_project('/srv/salt-formulas', 'vendor/_root/', for_user='root', extra_opts='-L', delete=True)
```

The final change you need to do is to make sure that the file roots for on the master include this extra directory:

```yaml
# Snippet
file_roots:
  base:
    - /srv/salt
    - /srv/salt-formulas
````
Eventually the Shaker class should be split out into its own module/dist but it can live here for now.

Thanks to @Sym for taking my shonky code and making the structure nicer.