Platform overrides

Ok so this resolves #85. See the changes to the README to see how to use this feature.

I'd appreciate it if someone could have a look over this and see if I'm missing any use / edge cases and or could write more tests. 

In particular I'm going to add comments in a couple of places where I think my promise handling doesn't need to be as complex as it is. 

So what happens now is:

- The app manifest *has* to be read even if a ZIP isn't going to be created. 
- For each target platform, a platform-specific set of options are built if `platformOverrides.osx` exists in the manifest, for example.
- For a typical (non-ZIP) Mac build, I just skip the `package.json` during the copying step and just write a new one instead.
- If ZIPs need to be created, then as few as possbile are created. If only one of four target platforms has platform-specific overrides, then there will only be two ZIPs created.
- I never generate a platform-specific manifest and store it temporarily somewhere on disk like I thought I would originally.

---

cc @steffenmllr, @gabepaez, @dylangattey 
I'm not sure about this. This works, but could it be simpler?

Instead of:

```js
return new Promise(function(resolve, reject){
    new Promise(function(resolve, reject){ 
         //...
    }).then(function(platformAgnosticZip){
         //...
         Promise.all(zipPromises).then(resolve, reject);
    }, reject);
})
```

I could have:


```js
return new Promise(function(resolve, reject){
         //...
    }).then(function(platformAgnosticZip){
         //...
         return Promise.all(zipPromises);
    });// not passing a second callback here to .then... will it bubble up/out?
```

But I'm no [bluebird](https://github.com/petkaantonov/bluebird) expert. In the previous example, if any of the `zipPromises` promises were rejected, then the whole `zipAppFiles` function's promise would reject with the error (as in it would bubble up/out to wherever it's being called from). 

In this version though, I just return the `Promise.all(zipPromises)` in the first callback passed to `.then`, but I don't pass a second. I'm not sure if the failure would still bubble up or would bluebird swallow the error and act like everything is fine. (I'm more used to [Q](https://github.com/kriskowal/q) where this can happen)