ZKL: fix for issue #84 and 2 other

multiple tweaks

Changes:
1) TextWindow.cs stabilize scrollbar during spam
- what I did is, I try to maintain scrollbar position when you are reading the text while the text is being feed constantly. The scrollbar usually shift for ~3 to 50 lines sometimes (to make space), but no longer. I automatically included that 3~50 line offset to your scrollbar in Textwindow.cs.

2) fix typo in "ADDUSER" safety counter
- this rare event when Uberserver mentioned non-existing player. Never go above 1 or 2 player but I found typo that could crash code in ChatControl.cs if it did go above 32. Fixed.

3) fix issue #84 , middle-mouse-button now actually ask Server to leave a room
- MMB usually tell the UI to close the channel, but this is fake. Player will still be in channel and cannot reopen the channel because of duplicate. I fix this in ToolTabs.cs by calling "LeaveChannel" function that I found in ContextMenu.cs

4) fix issue #85, having PrivateMessaging with same name as Channel now won't broke the Channel tab. 
- having same name as Channel seems like exploit, but if server could handle it, then ZKL should too. So I add identifying info "_pm" and "_chan" to the tabs in ChatTab.cs & ToolTabs.cs to avoid malfunction when the 'exploit' happen.

5) HistoryManager write chat-lines to file in delayed/buffered/burst style (related to no.4)
- I also have to buffer history write to prevent lock issue when both Channel & PM tries to write to same history filename. The buffer also mean 30 line LESS disk-write because I set it to "flushBuffer" (or write to disk) after 30 lines or 30 seconds or when ZKL close. (although I prefer to not write so often to avoid hard-disk fatigue... the correct value could be set in HistoryManager.cs if you wish to change, but its not a config for users).

6) Advertiser, Multiplayer & Rapid UI TAB do "lazy UI initialization" (only initialize when opened. Aiming for efficiency). 
- It occur to me that if I keep adding new tab (like the new skirmisher tab, not included yet), then it will increase ZKL resource usage, so I found this method to not allocate resource until User view it, this is named "lazy initialization". I apply this to Advertiser.cs , BattleChatTab.cs & DownloaderTab.cs and it seem to work. Memory usage only increase when page is viewed, and loading time for those Tab will be excluded from startup time. I also discover that the initialization time (the time for code to execute in Program.cs ( from beginning of Main function to showing MainForm())) is 1 second, but the actual delay is much greater. I think there might be other stuff that could do "lazy initialization" but might not be safe to do it now.  

I've tested the UI, and it work in Linux, I hope this PR is accepted. Thank you Licho!

p/s: Also note that Benchmarker do not need "lazy initialization" because it seems that included DLL already is lazy. For Unitsync, its only loaded when un-registered mod is first detected, and for Benchmarker, its loaded when player press "Benchmarker" button. They can't be unloaded unfortunately...