#14 Optimize task scheduling

This PR changes the `MarathonScheduler` to search the whole `taskQueue` for a matching task for every given offer. If no matching task is found, it continues with the next offer. If a matching task is found, it is started with the current offer.

Furthermore the tasks in the `TaskQueue` are now sorted by number of constraints. This way we check the tasks with constraints first and don't assign constraint free tasks to offers with matching properties for another task in the list.