initial import of cloudinit utility module

provides utilities for building multi-part userdata which allows
specifying multiple start-up scripts in a single user-data script
cloudinit: add #sc-store mime type and part handler

Add custom #sc-store mime type which is a dummy type for holding pickled
Python data. Added a null part handler which does nothing when called
given that the pickled data is not meant to be executed.
cloudinit: improve invalid user-data type error
cloudinit: auto-attach part handlers as needed

Added part_handler_mappings which maps custom mime types to their
corresponding part handler code (as a string). Currently only the
"#sc-store" custom mime type part-handler is there which simply does
nothing. This is because #sc-store mime type is used by StarCluster
client internally to store pickled Python data and is not meant to be
executed on the remote nodes. Updated mp_userdata_from_* to auto-attach
custom part handlers as needed.
cloudinit: add method to parse multipart userdata

Optionally decompresses the userdata string before attempting to parse
the multipart mail message.
cloudinit: add tests for multipart userdata utils
cluster: fix logging bug in run_plugin
cloudinit: use #ignored instead of custom handler

Use #ignored for storing data that should not be executed. Cloudinit
already handles #ignored with a null part handler that does nothing with
the file which is all the part handler for #sc-store was meant to do.
Removing this saves userdata space.
cloudinit: fix bug in mp_userdata_from_files

Only reopen the 'file' obj if it has a 'name' attribute. This allows
using StringIO objs that contain binary data in the files list. In the
case of StringIO's there's no real underlying file reopen in binary
mode.
cloudinit: utils for non-cloudinit multipart userdata

Added utils to cloudinit that can bundle many userdata scripts into a
single shell script that will extract and run all scripts on any
userdata handling system - cloudinit or not.
cloudinit: only support file interface

Removed convenience method for converting list of strings into file-like
StringIO objects. Will add string to StringIO utils later.
utils: add string_to_file and strings_to_files

These functions convert strings to in-memory file-like objects via
StringIO.
cloudinit: add high-level bundle/unbundle utils

Added new function, bundle_userdata_files, that serves as a high-level
wrapper around both the cloudinit and non-cloudinit approaches to
creating multipart userdata. By default cloudinit is used but this can
be switched by passing use_cloudinit=False.

Added new function, unbundle_userdata_files, that takes a userdata
string and automatically determines whether the string is a cloudinit or
non-cloudinit multipart userdata and unbundles the files accordingly. In
either case this function returns a dictionary of filenames -> file
contents.
tests: update cloudinit tests for latest changes
cluster: always set key_location in master_node property

This avoids a potential issue where Cluster.nodes gets called before the
cluster's key_location has been set which caches the master node object
with a key_location of None. In this case, attempting to use the master
node's ssh object later on, even after the cluster's key_location is set
propertly, would fail due to a null key_location. To avoid this we
simply inject the cluster's key_location everytime the cached or
non-cached master_node object is fetched.
cluster: store cluster metadata in group tags

Split and store metadata in cluster security group tags @sc-version,
@sc-core, and @sc-user instead of the security group's description
field.

Added dump_compress_encode function that converts a dictionary to json,
compresses the json with zlib and base64 encodes the compressed json.
Added decode_uncompress_load function that reverses the output from
dump_compress_encode back into a dictionary. These functions are
utlimately used by StarCluster to compress the data it stores in tags in
order to respect the 255 char limit for tags.
cluster: store aliases and plugins in userdata

First working draft storing and loading cluster aliases and plugins in
all node's userdata. By default the userdata is stored in a compressed
cloudinit format (multipart email). Added disable_cloudinit option to
Cluster class that instead switches to using a self-extracting shell
script to provide multipart userdata support for AMIs that do not use
cloudinit.
rename cloudinit module to userdata
move internal userdata filenames to static module
add disable_{cloudinit,queue} to metadata tags