app: Add an abstraction for Book provisioning

The idea behind this change is that the Spritzer (EpubSpritzer)
component is abstracted and no epub specific logic is used in the app.

Instead, this is abstracted under the SpritzerBook interface. EpubBook
is an implementation of SpritzerBook for Epub.

The rest of the application was refactored to use the new SpritzerBook
interface and the only tie to Epub now is in the AppSpritzer (formet
EpubSpritzer) which is an initialization component. In the future, if we
support multiple formats, we just have to demultiplex the construction
and add implementations of SpritzerBook for the new formats.

This also changes the TOC behavior to use a TOC if available and
fallback to spines if it is not.