Jgroups

__Dont merge yet!__

This PR introduces the cluster communication.

- Healthcheck and termination of dead nodes
- Commissioning and decommissioning of workers
- Assigning work to workers

To run, do the following

1. spin up an EC2 instance and copy your files there (also the `scheduler.priv`, `jgroups_discovery.xml` and `scheduler.properties`)
1. Run `install_worker.sh` with `sudo bash install_worker.sh`
1. Start the scheduler with `mvn clean install exec:java -Dexec.mainClass="scheduler.Scheduler" -Dmaven.test.skip=true -Djgroups.bind_addr=<EC2_PRIVATE_IP>` (Set the correct IP there of course)

Todo:

- [x] Nodes should only be terminated if they miss multiple healthchecks
- [x] Add comments
- [ ] Think about tests (a bit difficult since locally there cannot be multiple jgroup nodes with the used `S3_PING`
- [ ] Document some more stuff
- [ ] Restructure some stuff (probably) _(eg the `Scheduler` class is too big and has too many responsibilities)_
- [ ] Add a chaos monkey!

Closes #11 #12

@snorberhuis Can you have a first look?
Why not abstract this in a type that has a single responsibility that keeps track of a list of live nodes? To do so it has to check for cluster liveness. Scheduling is a different responsibility and has less to do with checking live nodes. The scheduler just needs to know about a list of live nodes. 

Scheduler is becoming a god class.