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...
I know that I'm being picky, but please make it final if possible. This is to enforce as strict api as possible to make this program a little bit safer (because we lack unit tests for the core...)