abstracted post audience; changed player PK

Player PK is now the tuple (no, game_id), where the number will be in the range 1..n (where n is number of players in the game). This makes setting initial state in setups easier by knowing that a player_no will always map to the intended role set.

Post audiences can be defined as either a role_id or a player_no. A player viewing a thread will see all posts that have an audience that matches any one of their roles or their player_no. This is a list intersection and a search for each post in the thread, which in theory would be quite expensive, but most posts and players will only have one role and one audience, and the comparisons are all on integers, so performance should be fine.