Avoid using the Environment class where easily possible because it forces homogeneous VM types

I'm trying to work with heterogeneous VMs, but this is difficult because the vm properties are often obtained from an Environment instead of from the VM. So I've tried to replace this where possible with the use of VMType instead (which can be easily obtained from a given VM).

It seems like a lot of the current scheduling algorithms rely on the assumption that all VMs are the same, so I think I'll try to create a separate type of algorithm that doesn't have this assumption. Possibly they can be merged to some extent eventually...
Just to check: do you mean the function `getTransfersPredictedRuntime(Task)`? I didn't introduce or modify that function (but I can delete it if you like).