HTTP and TCP Per-Task Health Checks

Addresses #174 
Supersedes PR #188

**Future enhancements:**

- `ActorLogging` should be replaced with a logger consistent with the rest of the app
- Events should be posted to the event bus:
    - health check added
    - health check removed
    - health check failed
    - health status changed

Health checks look like this inside of an `AppDefinition`:

```javascript
{
  // ...

  "healthChecks": [
    {
      "protocol": "HTTP",
      "acceptableResponses": [200],
      "path": "/health",
      "initialDelaySeconds": 10,
      "intervalSeconds": 5,
      "portIndex": 0,
      "timeoutSeconds": 10
    },
    {
      "protocol": "TCP",
      "initialDelaySeconds": 10,
      "intervalSeconds": 5,
      "portIndex": 0,
      "timeoutSeconds": 10
    }
  ]
}
```

The status of each health check is reported internally as follows for each active task:

```scala
case class Health(
  taskId: String,
  firstSuccess: Option[Timestamp] = None,
  lastSuccess: Option[Timestamp] = None,
  lastFailure: Option[Timestamp] = None,
  lastFailureCause: Option[String] = None,
  consecutiveFailures: Int = 0
)
```