Start Smilies.framework.

* Add an iOS Framework target.
* Link Awful against Smilies.framework and embed Smilies.framework therein.
* Move HTMLReader pod out of Awful and into Smilies.framework, so symbols are only defined once.

Bonus:

* Update CocoaPods to 0.34.1. Generated project changed a bunch.
* Rearrange Podfile so there are no "global" dependencies. Too hard to manage.
Start Smilie Keyboard.

* Add new Custom Keyboard target.
* Embed keyboard in Awful app bundle.
* Link keyboard against Smilies.framework.
* Move AWFUL_BUNDLE_ID_SUFFIX build setting up to project-level so keyboard's bundle identifier can always prefix Awful's.
* Add Awful and Smilie Keyboard to a common App Group.
Show helpful message on Smilie Keyboard when "Allow Full Access" is turned off.
I guess we need to code sign the Smilies test bundle? And fiddle with the keyboard scheme too.
Start the actual smilie keyboard view.

If you run the keyboard, you'll see some constraint conflict notices in the console. They don't seem to affect anything, and I couldn't find a reasonable way to silence them. They come from the inputView's initially having a constraint called "UIView-Encapsulated-Layout-Height" that forces the height to 0, breaking our layout.
Smilie data model.

* Metadata is a separate entity loaded by fetched property because we'll ship a read-only smilie store with the app, but we'll want to update metadata for those smilies.
Scrape smilies into bundled SQLite store.
Show bundled smilies in keyboard.
Tidy up Smilies imports.
Switch Awful keyboard bar to Auto Layout and tidy it up.

I'm getting it ready for a "Smilie Keyboard" button. In the process, stuck the autoclose button to the right (which was the plan all along I believe). The smilie button will stick to the left.

As for tidying, that horribly pointless public API is gone.
Add smilie keyboard to Awful compose screen.

Smilies should always be available in Awful, regardless of whether the keyboard's also been installed systemwide.

* Split SmilieKeyboardDelegate and SmilieKeyboardDataSource.
* Move data source code into a framework-implemented SmilieFetchedDataSource.
* Drop the prefix from AwfulComposeTextView.
* Add a smilie keyboard and data source to ComposeTextView.
Have keyboard extension insert text when running in Awful.
Skip the "needs full access" message if we're running in the Awful app.
Switch smilie data store's exposed managed object context to a main queue concurrency type.

My thinking had been to keep it private queue and set it as the parent to main contexts we create. Instead, let's leave the onus on the hypothetical scraper (or maybe SmilieDataStore) to merge changes in.