Fig compatibility layer 649

TODO deal with port edge cases, e.g. just container port specified, or IP and port specified on host
See http://www.fig.sh/yml.html

Fixes #649 with the exception of the TODO above (and possibly a couple of other edge-cases I haven't identified yet) and there are no functional tests yet.

Other than that, I think this is at least solid enough for a PR now and the branch is getting pretty large as it is, so I'd like to get this reviewed and do a new branch for anything missing.
This is far too big a function. Each of the various mini-parsers should be a separate method, as a first pass.

Insofar as you need to have some shared state, a new utility class `_FigParser` would allow you to store state needed during the parsing and have all the fig-specific methods in a separate class. Then you would just do:

```
def _applications_from_fig_configuration(self, application_configuration):
    parser = _FigParser()
    return parser.parse(application_configuration)
```

Or even have the caller of _applications_from_fig_configuration just do the above instead and skip the intermediate method.