Added custom config parser that ignores inline comments started with a pound sign.
Fixed #175 (current spot price in spothistory)
cluster: fix plugin pickling bug

The recent plugins kwarg refactored the code to use a list of plugin
objects rather than plugin settings from the config. The plugin objects
were then being serialized and stored in each node's userdata when
adding nodes.

This worked, however, if the plugin stored anything that's not
serializable after its first run, such as the list of nodes, this leads
to errors when later adding nodes in the same process. The loadbalancer
in particular is affected by this bug.

Fixed this by storing the __init__ kwargs and fully qualified class path
used to create the plugin in a __plugin_metadata__ attribute which gets
dynamically created via ClusterSetup.__new__. Updated Cluster class to
serialize a list of __plugin_metadata__ attributes (stored in
Cluster._plugins) rather than the plugin object list itself (stored in
Cluster.plugins). Updated Node.get_plugins to iterate through the
__plugin_metadata__ attributes and recreate the plugin objects.

closes gh-165
awsutils: fix TypeError in get_instance_user_data

get_instance_attribute can return a dict that *has* the 'userData' key
but the value is None. Updated the code in this case to replace None
with '' so that the b64decode call does not raise a TypeError.

closes gh-172
volume: move -F option for mkfs.ext3 to mkfs_cmd kwarg

The -F option is specific to mkfs.ext3 and should not be used
everywhere. Users will generally use something *other* than ext3 when
passing mkfs_cmd and in this case the -F option often does not apply
(e.g. mkfs.reiserfs). Moved the -F option to be apart of the default
mkfs_cmd kwarg instead.

closes gh-181
cluster: only configure tags when creating a new group

Previous code would apply tags to the cluster group regardless of
whether it was newly created or not. This was causing false-positives
when validating existing cluster groups given that any missing tags
would always be applied before validation. Fixed the code to *only*
apply tags to a security group the first time it creates the group.
cluster: use ec2.wait_for_volumes when attaching vols
cluster: stop all spinners in a finally clause

This ensures that all Spinner threads are killed regardless of errors.
tests: fix default_template usage in test config
Merge branch 'pr/160' into develop

closes gh-160
config: load plugin objects in get_cluster_template

This prevents multiple Cluster instances created via
get_cluster_template from sharing the same plugin objects. Reverted back
to storing plugin settings in a dict within the cluster template's
settings and only creating the necessary plugin objects when
get_cluster_template is called.
config: fix broken get_clusters function

This method is supposed to return a list of Cluster objects for each
template defined in the config. Updated code to append clusters to the
clusters array and not the iterator. Also updated the code to use the
cluster template name as the Cluster object's tag name.
config: minor code clean-up

Minor 'while' loop refactoring in _load_extends_settings and removed
unused get_cluster_names function.
config: use copy() of vol config in _load_volumes

Previously, _load_volumes would pass a reference to the original volume
settings stored in the StarClusterConfig object when parsing cluster
templates. Updated the code to use a copy() of the volume config
instead. This prevents a Cluster object or its plugin objects from
potentially modifying the original values in the StarClusterConfig
object.
image: fix KeyError when waiting for EBS AMI

closes gh-155
closes gh-178
tests: fix plugin loading tests
start: fix get_cluster_names AttributeError

closes gh-183
setup: update dependencies to latest versions

Use >= rather than == in install_requires to avoid cases where the OS
updates packages beyond the recommended versions. In this case the code
should at least try to work with newer deps so that 1) the user can at
least run the code if it's compatible and 2) bugs can be reported
against the latest versions of the deps if it's not.

Updated README and requirements.txt with latest dependency requirements.
cluster: load volume settings from master userdata

Updated load_receipt to catch MasterDoesNotExist and check for spot
requests before reraising. If spot requests are found load_receipt will
wait for the spot requests to activate, then for instances to activate,
and then attempt to refetch the master node. This properly handles the
case where you start an *all* spot cluster and cancel the start command
early on before any instances come up and then rerun the start command
with the --no-create (-x) option. In this case the code needs to wait
for the master to 'appear' before attempting to load the original
cluster settings.

closes gh-179
add --force option to terminate/stop commands

This option must be used whenever there are issues loading cluster
settings either due to an incompatible cluster or some other unknown
error.