In-app CSV upload of resources

Closes #126.

With this, you can upload a .CSV and indicate which items you want imported.  You can selectively add categories as needed and delete the .CSV afterwards. There's also some rudimentary duplicate detection - it'll do a case-insensitive match on the resource name.  When a duplicate is detected, the row will be highlighted in yellow and it won't be selected by default.

I had to rework a lot of the internals of the import process, but I think it's much more modular now.  I also had to rework the overall `db_fun` process - I think we had some weirdness with how the `lazy` parameter actually worked when we were creating/editing resources.  I also cleaned up parameter passing so it consistently passes around database sessions and consolidated the way we were assigning categories.