Extending service dependencies to allow finer grain control.
Instead of a single dependsOn field, there are fields for
provides, conflicts, install, and runtime. Within install and
runtime are 'requires' and 'uses' fields. The 'requires' list
in the runtime section is exactly the same as what dependsOn
used to be. Requires indicates the required service must be
also be on the cluster as well as enforcing task order.
Uses enforces the same task order as requires, but will not force
the service being 'used' to be placed on the cluster. For example,
datanode uses kerberos means datanode must be started after
kerberos, but only if kerberos exists on the cluster. Runtime
dependencies apply to initialize, start, and stop actions. Install
dependencies apply to the install action.

Also introduced the concept of conflicts, which prevents services
that conflict from being on the same cluster. Also introduced
provides, which allows a service like 'app-1.0' to provide the
'app' service, so that 'app-1.0' can satisfy dependencies on 'app'.

As part of this effort, refactored most of the dependency logic
into ServiceDependencyResolver.
removing unused code.
adding more comments, forcing Actions to be a singleton and
better error messaging in the case of conflicting services.
Merge pull request #87 from continuuity/feature/extend-dependencies

Feature/extend dependencies