Add more metadata to heartbeat messages

Initially, I'm adding a "type" field, which describes whether the worker is a app, dispatcher, or transport. This information will be used to better organize the display of workers in the heartbeat dashboard. Eventually, we'll want to add more metadata.

Each worker delegates the production of metadata to a helper class. This is somewhat preferable to cluttering up the Application, Transport, and Dispatcher base classes with metadata production functions.

Example:

```python
class CustomMetadata(HeartBeatMetadata):
    TYPE_NAME = "custom-foo-worker"
class CustomWorker(BaseWorker):
   METADATA_CLASS = CustomMetadata
```