General re-write of window handling for Desktop platforms.

Ok, finally got round to cleaning up my patch. 

This addresses Issue #669 and has been fully tested on my Windows machine. I've also got access to Linux for testing which I'll do ASAP. 

If there are too many unnecessary changes, let me know - I also did a little refactoring as I went a long and that could be reverted to make the logical differences more clear. 

On Windows, the behaviour outlined at MSDN for user resizing (http://msdn.microsoft.com/en-us/library/bb203876(v=xnagamestudio.40).aspx) now works as expected. In addition, a user may programatically change the window size by setting the GraphicsDeviceManager PreferredBackBufferWidth/Height and calling ApplyChanges() as is the behaviour in XNA. 

There's a lot of new stuff in this patch so it definitely needs to be tested thoroughly before merging.