[#1811] Customizable dependency configuration

Currently, the dependency mapping is `default->*` but this is problematic when you depend on libraries that have huge lists of optional dependencies. This results in either you excluding each one individually or specifying `transitive: false`, which is also bad because that also excludes required transitive dependencies. This commit introduces a new top level value that can be used in dependencies.yml. It allows you to specify
```
configurations:
    - optional:
        exclude: true
```
The way this functions is, if no configs are provided then the default mapping is used (`default -> *`). If only `exclude` mappings are provided, then the mapping becomes `default -> *, !excludedConfig1, !excludedConfig2,...`. Ivy will then depend on all configurations that are not excluded. If at least one non-excluded configuration is provided, the the listed configurations are all that will be used. For example:
 ```
configurations:
    - compile
    - runtime
    - optional:
        exclude: true
```
will map to `default -> compile, runtime, !optional`