Split puppet handler for CloudInit into its own file
Clean up exposed API

- Marked do_* functions as private.
- Renamed command-line processing to parse_args, will accept alternative
  set of arguments
Add help strings for command-line options
Fix command line overrides

- 'client-token' override was missing
- overrides for names containing dashes were broken because of how
  attributes are actually named...
Credit where credit is due
Code hygiene: mark _private stuff so
BlockDeviceMapping for RunInstance and SpotRequests

In AWS DeleteOnTermination defaults to True. In boto it defaults to
False. Here, we side with AWS with the intention of simplifying the
disposable instances use case.

On a tangentially related note, AWS doesn't require a device name, while
boto does. However, in auto-scaling groups device names are required by
AWS. For now, hc2000's schema requires device names as well.
BlockDeviceMappings for AutoScaling groups

Technically, for launch configurations.

Boto is currently buggy in the way it handles block device mappings in
launch configurations, so workaround it. Here, this is doen by tricking
boto into letting plain AWS API parameters through.

(See https://github.com/boto/boto/pull/1574 for details on the boto
issue, or a fix)
Shared global and per-region definitions

Multiple paths can now be configured as search paths, enabling global or
per-region settings to be shared across instance definitions.

Instance definitions are sequentially loaded from search paths and
merged together. For the time being merging is 'dumb' where settings
picked up later take precedence over earlier ones.

This change also enables files containing command-line options to be
processed by prefixing their names with '@', which is useful when
repeatedly passing multiple --instance-path options.
"Pretty" metavar options for the command-line, rewrap code
Allow symbolic names in place of IDs

Combined with instance search paths and '~default~' definitions, this
enables global and regional settings to be maintained outside of
individual instance definitions.
Avoid infinite loops

Now using iteration, instead of recursion, when resolving symbol names.
Visited values are tracked to detect (break and ignore) loops.
Use python string formatting

This is currently enabled in symbolic names and in --instance-path
options.
Transform user-data arrays into MIME/Multipart
Quick and dirty building of user-data from file
Quick and dirty automated puppet setup

This uses user-data => CloudInit integration to hook up puppet
manifests.

This is hooking puppet-related logic within an otherwise generic tool.
It's ok for now, but going forward I'd rather have it as some sort of
external plugin.