core: Ensure config directory exists before getting lock

Fixes startup on first time use, regression from a9829c60
ui: Add PageView component

PageView displays one of a list of items, and switches between items
based on an associated key. This is useful for pages tied to a view's
selection.
ui: Separate non-window logic from ChatWindow into ChatPage
ui: Add optional combined chat window mode

Closes #19
core: Keep a permanent ConversationModel for each contact
core: Add unread count in ConversationModel
ui: Show unread message count on contact list
ui: Alert main window when messages arrive
ui: Clear history when closing ChatWindow in non-combined mode
ui: Add General preferences page and combined window setting