Add bulk email feature for instructors, with optout option

Adds a new Email link to the instructor dashboard for frontend interface to send
email to course members. Adds a feature flag ENABLE_INSTRUCTOR_EMAIL to toggle this.
Creates a new djangoapp bulk_email that handles this action by getting the recipient
list and batching the emails to different celery tasks to do the actual sending.
Requires lynx package to convert HTML email to plaintext. Handles SMTP errors by
retrying or falling through to the next email. Adds the option to opt out of course
specific emails in the user dashboard with an Email Settings link for each course.
Uses severable configurable settings with defaults. DEFAULT_BULK_FROM_EMAIL
specifies the from address for email. EMAILS_PER_TASK specifies the number of emails
each celery task takes on. EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER,
EMAIL_HOST_PASSWORD, and EMAIL_USE_TLS for the SMTP email backend settings.

Co-authored-by: Akshay Jagadeesh <akjags@gmail.com>
Add HTML editor for authoring bulk email message (adopted from CMS)
Add delay to course bulk email task and use SITE_NAME for site url

 Delay for possible race condition with fetching course email object.
 Use settings.SITE_NAME for host name to generate email footer url.
Bulk Email: Add design styling

Switch to using decorators; refactor and cleanup tests.
Disable bulk email for XML-backed courses
Refactor html->plaintext conversion (for bulk email) into separate library
Change bulk email model field names and add migrations
Hide "Email Settings" from student dash if bulk email not enabled

Some minor pep8 cleanup
Change optout to use user.id instead of email.

Includes Data + Schema migrations for optout email -> user.id change.
Note that migrations should be reversible.
Add editable templates for bulk email

Adds the edX Marketing-approved template as html default.
Bulk email - final tweaks and cleanup