Actually memoize MappingsBatch#canonical_paths

In development, on a batch of 13,000 paths, this took the time to show the
Bulk Add preview from 7-8s to 4-5.5s.
Create BulkAddBatch and use it for bulk add

This lets us add a second subclass for the ImportBatch which will have
different inputs and behaviour.
BulkAddBatch should create BulkAddBatchEntries
Basic ImportBatch#create_entries
Add ImportBatchRow

This will represent a row in the import CSV/TSV. It will act like a presenter,
encapsulating knowledge of how to translate the row into a ImportBatchEntry.
Add a basic ImportBatchesController
Add basic specs for ImportBatchesController

Also move the shared examples for a user without permission into
AuthenticationControllerHelpers.
ImportBatchesController creates a batch
Rename @import to @batch for the #new action

This makes the instance variables consistent with the #create action.
Add an import preview page

This displays counts of each type of mapping to be created, and a
table which currently contains all of the batch's entries (rather
than the first 20).

The table duplicates small parts of the _mappings_table partial, but
since that partial includes many behaviours we don't need here it is
simpler to have this duplication instead of trying to make the partial
usable in this context as well.

This also adds a feature for the happy path (at the moment it only goes
as far as the preview page).
Handle the old URL being an absolute URL
Canonicalize the old URL

ImportBatchRow needs the site to do this.
Basic semantic sorting of ImportBatchRows

Where there are multiple rows for an old URL, especially after canonicalization,
this will enable us to choose the "best" row from a CSV of mappings by sorting
them.
Refactor tests for line length
Earlier redirects trump later ones

To do this, we had to add line_numbers so that an ImportBatchRow can tell if it
came before another.
Raise an error if comparing ImportBatchRows w/ different paths

You shouldn't be comparing rows for different paths. We had to change the specs
to comply with this as we had been breaking that rule.
ImportBatch only creates deduplicated entries
Memoise ImportBatchRow#path and #type

We're now potentially calling these methods a lot, and they are relatively
expensive but are static.
Relate ImportBatchEntries to existing mappings

This will allow us to display a count of how many mappings you might be
overwriting and to show which ones would be overwritten in a preview.
Display how many mappings will be overwritten