admin: Fix project actions

Make the `apply` and `check_apply` function get as first argument the
project.
admin: Validate delete IP action
admin: Handle any exception in actions

Catch any unhandled exception in the action view. Return "500" as status
and use as message the message of the exception. Also, log the traceback
in the gunicorn log.
admin: Add custom check for the "Suspend" action

In astakos projects, the action "Suspend" does not check if the project
is already suspended, so we check that ourselves.
admin: Add check for network drain/undrain
admin: (Un)Suspend/(Un)Drain only for non-deleted
admin: Do not block valid emails

The following email: "Some one <me@you.gr>" is valid for Django.
Therefore, we should not block it, but check if the last chunk of the
string is a valid email.
admin: Work-around a weird behavior of Django's QS

In the filter functions of project, there is a `filter_user` function
that has very weird results when it gets passed to `values_list`. I have
checked that depending on whether `values_list` is in the provided
queryset or not, the returned results may omit the base project of the
user.

This is countered by using `select_related` on the `owner__uuid` field
of the Project model and then evaluating the queryset before using
`values_list` on it.

I have found no justification for this behavior. I believe that what we
do here lies on the gray area of Django ORM since we use `values_list`
for attributes such as "owner__uuid" which may not exist in the Project
instance. It should be interesting however to report it to the Django
team, once I can reproduce it somewhere else.
Merge branch 'feature-admin-actions' into feature-admin