Added custom config parser that ignores inline comments started with a pound sign.
awsutils: fix minor bugs in wait_for_snapshot

Fixed issue where progress bar could potentially be updated after it's
finished. In this case the progress bar was being displayed on two lines
vs the usual single line.

Prevent unnecessary time.sleep after an update where snap.status ==
'completed'. This speeds things up by a refresh_interval.
awsutils: add wait_for_volume util

Takes a volume and waits for either its status or state to change to a
given value. If both a status and state are given it waits for both
transitions one after the other.
awsutils: add info msg to create_volume

Displays size, zone, and snapshot_id (if any) of the volume being
created.

Moved the info message used in volume.py to awsutils.py
volume: use ec2.wait_for_volume everywhere

Consolidated cleanup code used by both create and resize to delete the
generated volume in case of failure.
volume: cleanup vol on failure in resize()
volume: warn about volume hosts in finally block

Now that we're on Python 2.6+ its better to use the finally block to
handle warning users about lingering volume hosts which will always be
called even in the case an exception occurs.
volume: log execution time for resize()
volume: move snapshot clean-up to finally block

Any snapshots created during resize should be removed in both the case
that the volume was successfully resized and in the case that an error
occured. Created wrapper function _create_snapshot that caches the
intermediate snapshot so that it can easily be removed later within the
finally block.
volume: fix bug in _warn_about_volume_hosts

This method wasn't handling the case where the user specifies their own
volume host instance to use and instead only checked for hosts
automaticaly launched by create/resize. Updated the code to warn about
any instances autogenerated by create/resize, if any, as well as any
instance specified by the user.
volume: call e2fsck before resize2fs if needed

Checks to make sure the resize command is resize2fs, which implies
you're using an ext filesystem, and if so calls e2fsck -f first and then
runs resize2fs. If you're not using resize2fs then e2fsck will not be
called.

closes gh-168
spothistory: enable -z option (for real)

Fixed stupid mistake where I forgot to call ec2.get_spot_history with
zone kwarg.
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