Added a Forum

Resolves #498.
Resolves #895.

http://jenkins.buttonweavers.com:8080/job/buttonmen-AdmiralJota/142/

Depends on #862 for hashbang and color support.

@blackshadowshade: I'm guessing glassonion will probably ask you to look at the SQL in this one as well.

@cgolubi1: You'll probably want to pay special attention to ```Env.prepareRawTextForDisplay()```, as this is what now santizes user input for display (for both chat and the forum). We're also putting the raw user input into the ```data-rawPost``` attribute in ```Forum.buildPostRow```. I believe this is safe, but I wanted to give you a heads up anyway. It probably deserves a little extra testing attention.

I assume that as soon as this goes online, there'll be a half dozen new tickets with suggestions for improvements...
Hmm, i'm confused by this --- i intended for Api.js to have these invariants:
* `Api.apiParsePost()` is for calling API functions that get and parse data from the server (but don't change server state)
* `Api.apiFormPost()` is for calling API functions that change server state
* Functions invoke `Api.apiFormPost()` from individual UI modules, not from Api.js

Maybe those invariants don't make sense, but that's what i had in mind, and i think having a dedicated function `Api.markForumRead()` which (1) lives in Api.js, (2) invokes an API routine that changes server state, and (3) uses `apiParsePost()` to do so, violates all three invariants.

Thoughts?