Initial functionality - download and save

Download all settings for a zone and save them to a JSON file. The settings
are converted from an array of maps to a flat map, to make it easier for
humans to read and easier to check for the presence of a key.
Compare local and remote configurations

Log the changes only. Missing keys are only detected in one direction
(present in remote and absent in local). DeepEqual works fine on these
`interface{}` values.
Split some of getSettings into makeRequest

In preparation for add a function to modify settings that will also need to
make requests. I've moved authEmail, authKey and zoneID to global variables
so that we don't have to pass them through several functions. Unsure about
this, but it seems like the best solution.
Log response body on non-200 response codes

The errors in the response body are often useful. Log as a plain string,
because there's a chance that it may have produced the error before
rendering valid JSON.
Find missing keys in remote config

So that we can detect typos in our local config in addition to new keys in
the remote config. This could probably be simplified by using "sets", but Go
doesn't have a set implementation in stdlib and I don't want to import any
additional libraries at this stage.
Update config when different

Submit changes to make the remote config match the local config.

I've renamed the compare function to indicate that it's now calling updates
too. I did attempt to split out the update part, but by returning a new
`Config` item we couldn't easily log the `old -> new` value just before
changing it.

I've had to construct a new struct for the request because we need to pass a
JSON document that has a single "value" field.
Parse Response.Result separately

Perform a separate parse of `Response.Result` and only do this for
`getSettings()` because the response to `changeSetting()` has a single
result instead of an array of results which causes this error:

    Parsing response body as JSON failed json: cannot unmarshal object into Go value of type []main.ResponseSetting
Add dry-run mode

Logs changes only and doesn't submit updates to the API.
Check mandatory flags

Make sure that all of the flags that we need to operate are passed.
Make -file flag mandatory

To prevent mistakes like reading the config from one zone ID and then
submitting it back to another zone ID. By specifying the filename this
should be more obvious.
Add usage and considerations to README.
Add binary to gitignore.
Rename structs

To better indicate what they are.
s/rootURL/RootURL/

To help indicate that it's a global variable.
Add function documentation

And s/id/key/ a variable to match the docs.
Add -list-zones argument

bob asked a good question - how do you find the value for the -zone flag.

I originally got this by querying the API with curl. Then I forgot about it.
This isn't ideal for other users, so add the ability to list all zone names
and their IDs.

I've modified checkRequiredFlags() because we no longer need all of the
flags at the beginning. Depending on what route we're going to take. I've
also remove the else condition to match the early return for listZones.
CloudFlare struct with Settings/Zones methods

This is the first step towards something that's a more organised and easier
to test. Paired with Kush.
Add authentication email/key to CloudFlareQuery

These headers will be appended to every request.
Replace getZones() and getSettings()

With new methods from CloudFlare struct, Zones() and Settings().
Split CloudFlareQuery to separate file

And move tests to match. Since this is self-contained.