Exponential Task Launch Back-off (per-app)

Adds a configurable (per-app) exponentially increasing task launch cool down interval.

See issues #20 and #258 
Supersedes #345

Two new optional parameters are now exposed in an app.  The values shown below are the defaults.

```json
{
  "launchDelaySeconds": 1,
  "launchDelayFactor": 1.15
}
```

Each time a task fails, is lost, or is killed due to failing too many health checks, the launch delay for that app's tasks increases by the supplied factor.

See the following log snippet to get a feel for how this plays out:

```
[INFO] [07/11/2014 15:12:07.793] [marathon-akka.actor.default-dispatcher-9] [akka://marathon/user/$b] Received health result: [Healthy(toggle.46b17e70-0948-11e4-9ca2-685b35a05cac,2014-07-11T22:12:07.793Z)]
[INFO] [07/11/2014 15:12:09.813] [marathon-akka.actor.default-dispatcher-13] [akka://marathon/user/$b] Received health result: [Unhealthy(toggle.46b17e70-0948-11e4-9ca2-685b35a05cac,2014-07-11T22:12:09.813Z,410 Gone)]
[INFO] [07/11/2014 15:12:11.834] [marathon-akka.actor.default-dispatcher-15] [akka://marathon/user/$b] Received health result: [Unhealthy(toggle.46b17e70-0948-11e4-9ca2-685b35a05cac,2014-07-11T22:12:11.834Z,410 Gone)]
[INFO] [07/11/2014 15:12:13.853] [marathon-akka.actor.default-dispatcher-15] [akka://marathon/user/$b] Received health result: [Unhealthy(toggle.46b17e70-0948-11e4-9ca2-685b35a05cac,2014-07-11T22:12:13.853Z,410 Gone)]
[2014-07-11 15:12:14,721] INFO Syncing tasks for all apps (mesosphere.marathon.MarathonScheduler:296)
[2014-07-11 15:12:14,721] INFO Requesting task reconciliation with the Mesos master (mesosphere.marathon.MarathonScheduler:313)
[2014-07-11 15:12:14,722] INFO Already running 1 instances of toggle. Not scaling. (mesosphere.marathon.MarathonScheduler:377)
[2014-07-11 15:12:14,728] INFO Received status update for task toggle.46b17e70-0948-11e4-9ca2-685b35a05cac: TASK_RUNNING (Reconciliation: Latest task state) (mesosphere.marathon.MarathonScheduler:144)
[INFO] [07/11/2014 15:12:15.873] [marathon-akka.actor.default-dispatcher-15] [akka://marathon/user/$b] Received health result: [Unhealthy(toggle.46b17e70-0948-11e4-9ca2-685b35a05cac,2014-07-11T22:12:15.873Z,410 Gone)]
[INFO] [07/11/2014 15:12:15.873] [marathon-akka.actor.default-dispatcher-15] [akka://marathon/user/$b] Killing task toggle.46b17e70-0948-11e4-9ca2-685b35a05cac on host localhost
[2014-07-11 15:12:15,874] WARN Task [toggle.46b17e70-0948-11e4-9ca2-685b35a05cac] for app [toggle] was killed for failing too many health checks (mesosphere.marathon.MarathonScheduler:198)
[2014-07-11 15:12:15,877] INFO Task launch delay for [toggle] is now [10] seconds (mesosphere.util.RateLimiter:39)
[2014-07-11 15:12:16,601] INFO Received status update for task toggle.46b17e70-0948-11e4-9ca2-685b35a05cac: TASK_KILLED (Command terminated with signal Terminated: 15) (mesosphere.marathon.MarathonScheduler:144)
[2014-07-11 15:12:16,608] INFO Task toggle.46b17e70-0948-11e4-9ca2-685b35a05cac removed from TaskTracker (mesosphere.marathon.tasks.TaskTracker:81)
[2014-07-11 15:12:16,611] INFO Need to scale toggle from 0 up to 1 instances (mesosphere.marathon.MarathonScheduler:352)
[2014-07-11 15:12:16,611] INFO Queueing 1 new tasks for toggle (0 queued) (mesosphere.marathon.MarathonScheduler:358)
[2014-07-11 15:12:27,611] INFO Received status update for task toggle.710cfff1-0948-11e4-9ca2-685b35a05cac: TASK_RUNNING () (mesosphere.marathon.MarathonScheduler:144)
[2014-07-11 15:12:27,611] INFO Task launch delay for [toggle] reset to zero (mesosphere.util.RateLimiter:46)
[INFO] [07/11/2014 15:12:27.995] [marathon-akka.actor.default-dispatcher-18] [akka://marathon/user/$b] Received health result: [Healthy(toggle.710cfff1-0948-11e4-9ca2-685b35a05cac,2014-07-11T22:12:27.995Z)]
```

Testing:

`POST` the following to `/v2/apps`:

```json
{
  "id": "toggle",
  "cmd": "python toggle.py $PORT0",
  "cpus": 0.2,
  "mem": 32.0,
  "disk": 0.0,
  "ports": [0],
  "instances": 1,
  "launchDelaySeconds": 2,
  "launchDelayFactor": 2.0,
  "uris": ["http://downloads.mesosphere.io/misc/toggle.tgz"]
  "healthChecks": [
    {
      "gracePeriodSeconds": 10,
      "intervalSeconds": 2,
      "maxConsecutiveFailures": 3,
      "path": "",
      "portIndex": 0,
      "protocol": "HTTP",
      "timeoutSeconds": 10
    }
  ],
}
```

This app's tasks can be made unhealthy by sending a `GET` to the task's `/toggle` endpoint.
Will swap for `mutable.SynchronizedPriorityQueue`