Revamp the review request layout.

We've had the same look to the review request box since the dawn of
time. With 2.0, we're changing that to take up less vertical space,
to bring a little more consistency with some of the fields, and to
highlight the main content of the review request.

The main information (Summary, Description and Testing Done) are now
shown one after another, with the same font style used for the labels.

On the right-hand side is the list of fields we previously had between
Summary and Description. They're a single column now. This takes the
space that was often just left unused within the Description/Testing
Done fields (since those fields were often far wider than the contents).

Simplifying this into one column will also make it easier to lay out
fields provided by hooks.

The Screenshots, File Attachments and Issue Summary are displayed after
all the fields, as before. Their labels match the style of the Summary,
Description and Testing Done labels.

The Issue Summary table has been cleaned up a bit to have the filters
and the counters on the same row, reducing the amount of vertical space.
Add blank lines around lists in rendered Markdwon.

This improves the readability of Markdown-rendered lists by adding
some spacing. There's now spacing between paragraphs within a list (in
the case of a list item with multiple paragraphs), and spacing between
list items. These help prevent things from getting too bunched up.
Fixed the icon on the expand/collapse button for reviews.

I recently fixed the icon for the button on change descriptions, but was
missing a single line for reviews. This adds it, providing the proper
state for the button.
Fixed issues saving Markdown data in certain cases.

There were two known bugs with saving data in Markdown.

One was specific to review replies, and was on the JavaScript side of
things. We weren't setting rich_text=true when making requests to the
server, but we had it set client-side. This produced an interesting mix
of Markdown rendering and escaping that was clearly very wrong.
Now we set rich_text= on all requests.

Server-side, we had problems when making an API request setting text
without specifying a rich_text=, when the object server-side already had
rich_text=true set. It would assume all incoming text was going to be in
valid Markdown. That was a problem when updating published review
requests/drafts. It also affected comments, reviews and replies (if done
via the API outside of the Review Board web UI).

For the API, we now have a nice MarkdownFieldsMixin that offers a
centralized function for normalizing fields based on the request data.
It handles the escaping/unescaping of all necessary fields (if passing
rich_text=), as before, and will now also handle escaping provided
fields if the object has rich_text=true and the request doesn't specify
a rich_text=.
Don't show the asterisk next to "Reviewers" when closed.

All the "required field" asterisks on the page were created dynamically
by the inlineEditor except for the one next to "Reviewers." That one was
always there if the user had edit access, even if the review request was
closed and couldn't be edited anymore. This fixes the logic to hide it
in this case.
Re-enable the Publish/Discard buttons for replies after a second save.

The Publish/Discard buttons on the review reply banner disable
themselves while saving, but they never re-enabled themselves again.
This was a problem for the second reply made on a change. Now they
re-enable after the "saved" event.
Fix saving review request fields in rich text.

ReviewRequestEditor was only setting rich_text=true if it wasn't already
rich text, but the API now requires it to be sent if any field being
passed in the request is in Markdown format. Set it any time we're
updating a text field.
Add back the buttons for the textareas on the review request.

The recent layout change accidentally removed the OK/Cancel buttons on
the textareas. We only wanted to remove them for the fields on the side.
This fixes things to bring back the ones for text areas.
Add protection against a null LocalSiteProfile.permissions.

It appears that it's possible a LocalSiteProfile.permissions to be None,
and in this case, permission lookups will fail. We're now more careful
about this, and default it to {} when processing.
Fix default focus in the Review form.

The default focus for text areas in the Review form wasn't always
correct. This has been fixed on master, but not 1.7.x. We now tell all
the inlineEditors not to focus themselves by default, so that we can
control the focus.
Merge branch 'release-1.7.x'
Use the more modern six library to handle urllib, cStringIO, and cPickle.

The urlparse, urllib, and urllib2 modules have been significantly reworked in
Python 3 to provide a much more consistent interface.

Additionally, the 'fast' versions of StringIO and pickle are now merged with
the 'slow' versions, so in the future we'll be able to just use io.StringIO and
pickle without the fallbacks.

'six' has some adaptations to help with this for the time being. It's not as
pretty as I would like, but it works. The ugliest part of this is for places
where we override netloc_uses, which isn't among the "moved attributes" in six.

Testing done: Ran unit tests.
Reviewed at https://reviews.reviewboard.org/r/4936/