Use caching in BioImages.
DATA-1526 Reorganize type data in World Rotifer Catalog
LD-1123, DATA-1539, DATA-1540
DATA-1542, DATA-1543, DATA-1545
DATA-1546 Duplicate, inaccessible images from India Biodiversity Portal
DATA-1550 Make use of LifeDesk's Image Gallery to complete image list for Scratchpad
Follow-up DATA-1550
DATA-1552 Olividae bib
DATA-1544 Structured data from wikipedia for fungi
Change calling convention: all crops done at once

To save the crop location, we need the crop code to return a single set
of values, even if there are multiple square thumbnail sizes. This
change means that all the cropping is done by a single call to the
(renamed) function create_crops(), which returns the percentage crop
positions.
correct logic if getimagesize() fails
rejig to use crop percentages, save in db

Several changes here: make create_crops() take a specific
crop_percentage argument, rather than an unnecessary array of options.

The css crop position calculations are moved into crop_image(), which
is only called for a user-initiated crop, where the data_object_id is
known, and we assume that a height and width have already been stored
in the image_sizes table. The other time that the option crop_pct can
be set is when reharvesting a known data_object with a custom user
crop.

Other changes are to make the logic & names clearer in
create_content_thumbnails(), and comment more clearly about CS cropping
arrangements. Also allow for a non-square region to be selected (made
square later).
Properly express as %ages, validate from 0...100
Reuse crop info when force_redownloading
Oops: add data_object_id to grab_file call if necc
use previous crop info when caching image obj
Save image width & height in image_sizes table
Brief comment about where the row is created
When deleting data object, remove from image_sizes too
Move DB checking code out of DataObj into ContentManager