Allow ComposeWidget to be created through a purpose-specific static API

Gui::ComposeWidget:
* provide static methods for creating a ComposeWidget for each of
the purposes, viz blank composer, from a draft, from a url, as a
reply.
* make the constructor private
* make methods like loadDraft() and setResponseData() act as
private helpers for setting up ComposeWidget for the required
purpose.
* provide a helper for creating these widgets that can catch a nullptr
for a ComposeWidget reference and throw a warning message to the user.

Gui::MainWindow:
* remove the invokeComposeDialog method as ComposeWidget can be
created using the static, convenient, purpose-based API.
* provide a MSAFactory object through the public API for users
creating ComposeWidget instances
* provide a getter for m_settings

REVIEW: 118910