Add custom password reset form accepting username

The contrib.auth password reset workflow is hard coded to only accept an
email address, so I had to reimplement the view logic in addition to
tweaking the form.