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.
Add variables used by descriptor css
Internationalize strings
Use decorators, fix docstring, multiline string
LMS: lightly revises styling and semantics around instructor emails
Refactor tests and code cleanup
Disable bulk email for XML-backed courses
Unicode email tests
Refactor html->plaintext conversion into separate library
Address review comments
Change `to` field to be `to_option`
Change reference by `hash` to `email.id`
Add migration for last two commits
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.
Clean up some Pylint violations
migration minor bug fix column name user -> user_id
Clean up violations