removenode: minor updates to help docs
addnode: move _get_duplicate to CmdBase

..so that it can be reused in removenode.
removenode: remove duplicate exception raising

This exception gets raised in Cluster.get_node_by_alias.
cluster: deprecate get_node_by_* functions

...in favor of the new get_node and get_nodes methods. Combined all
get_node_by_* checks into get_node and also added checks for other
unique identifiers. Updated get_node_by_* methods to prompt a
deprecation warning and then proxy the call to Cluster.get_node. The
get_node_by* methods will be removed in a future release.

The get_node function take an identifier string and returns a node if
it's able to match any unique instance attribute to the identifier. For
example, you can pass in the instance id, alias, dns name, public ip,
private ip, etc. The get_nodes method will do this for a list of
identifiers and also takes care to remove potential duplicates from the
resulting node list in case you, for example, pass an instance id and an
alias for the same node in the list of identifiers.
fix all deprecated get_node_by* calls
node: remove 'or None' from return in addr property
cluster: add num_nodes kwarg to remove_nodes

..and changed the 'nodes' arg to an optional kwarg. This makes it
possible to either pass in a list of nodes to remove as before OR pass
in a number of nodes to be automagically selected and removed. Nodes are
selected counting backwards from the highest node number.

Also changed the 'nodes' arg to Cluster.remove_node an optional kwarg -
it's now only needed if you want to remove a specific node otherwise the
node with the highest node number is fetched and removed.
cluster: check for master in remove_nodes before removing

Cluster.remove_nodes will never remove the master node. Previously, the
method would remove nodes up until it ran into the master at which point
it would raise an exception. Updated this code to check the node list
for the master node and raise the exception before removing any nodes.
make alias arg a kwarg in ClusterManager.remove_node

Not specifying the alias kwarg lets the Cluster object automatically
select a node to remove.
cluster: add ClusterManager.remove_nodes method
cluster: minor code clean-up in Cluster.add_node
removenode: update usage to be similar to addnode

The removenode command can now be used similar to the addnode command,
e.g.:

$ starcluster rn mycluster # selects and removes a single node
$ starcluster rn mycluster -n 3 # selects and removes three nodes
$ starcluster rn mycluster -a node001,node002 # remove specific nodes

Deprecated the old usage where users passed a list of node aliases to
remove as arguments, e.g.:

$ starcluster rn mycluster node001 node002 node003

This still works but prompts a warning for now. Support for this
deprecated usage will be removed in a future release.
Merge branch 'make-removenode-like-addnode' into develop