Dependencies convergence properly relies on requirements

Previously Mix required dependencies to have exactly the same
requirements but now we just check all requirements satisfy the
current version.
Store only app names in Mix.Dep.deps
Add support for optional dependencies