Remove extraneous OTM codes and their species duplicates

We want to add a uniqueness constraint on `Species` objects:
    `(instance, common_name, genus, species, cultivar, other_part_of_name)` should be unique.

But we have duplicates in our own data -- 6 cases where two OTM codes have the same species info.
For those 6 pairs we'll keep one and kill the other, updating uses in our i-Tree code tables.
Luckily, no production instance has a tree or i-Tree code override pointing to one of the species we want to kill.

Here are the pairs, with lines showing (otm_code -> itree_code in itree_region).
* indicates variants to delete.

Yellow buckeye (Aesculus octandra)
    AEFL -> BDL OTHER in PiedmtCLT
   *AEOC -> AEHI in NoEastXXX

Paraguay nightshade (Lycianthes rantonnei)
   *LYRA -> BES OTHER in CaNCCoJBK
    SO1  -> BES OTHER in SoCalCSMA

Tipu tree (Tipuana tipu)
   *TITI2 -> BDL OTHER in CenFlaXXX
    TITU  -> BDL OTHER in TropicPacXXX

Oriental arbor vitae (Platycladus orientalis)
    PLOR80 -> CEL OTHER in TropicPacXXX
   *THOR   -> THOR in CenFlaXXX
              CES OTHER in InlEmpCLM
              CES OTHER in SoCalCSMA
              BES OTHER in SWDsrtGDL

Winter cassia (Cassia bicapsularis)
   *CABI2 -> BDS OTHER in CenFlaXXX
    SEBI5 -> BDS OTHER in GulfCoCHS

Patmore ash (Fraxinus pennsylvanica, "Patmore")
   *FRPE2  -> FRPE in InterWABQ
    FRPE_P -> FRPE_M in InlValMOD
Remove duplicate species introduced by custom import mistakes

Our databases have duplicate Species objects due to previous mistakes on custom imports.
Eliminate one of the duplicates, moving any existing trees to the other duplicate.
Add Species uniqueness constraint

Also, don't try to add species twice in tests
PR fixup: add comment
Add general resolver to importer
Merge pull request #1814 from RickMohr/species-uniqueness-constraint

Species uniqueness constraint
Merge pull request #1821 from steventlamb/topic/importer_resolver

Add general resolver to importer
Fix *occassional* npm install failures on Travis CI

https://github.com/travis-ci/travis-ci/issues/2244#issuecomment-55473829
mentions creating the npm directory manually as a temporary workaround
Merge pull request #1824 from maurizi/fix-travis-npm

Fix Travis CI npm install issues
No leading or trailing blanks in UDF names

* Data migration to delete existing ones
* `strip` before saving
* Update a test to ensure leading and trailing blanks removed
Merge pull request #1820 from RickMohr/trim-udf-names

No leading or trailing blanks in UDF names
Get valid i-Tree codes by region from ecoservice

Fixes false negatives when an i-Tree code is valid for a region but no OTM code references it.

Requires OpenTreeMap/ecobenefits#43
Merge pull request #1826 from RickMohr/get-itree-codes-from-ecoservice

Get valid i-Tree codes by region from ecoservice
Skip tests requiring i-Tree code validation if ecoservice not running
Merge pull request #1829 from RickMohr/skip-tests-if-no-ecoservice

Skip tests requiring i-Tree code validation if ecoservice not running
Fix merging of i-Tree code field

In the "merge species" UI, for the i-Tree code "imported value", display just region/code pairs which differ from the species, rather than the raw import value (which may have region/code pairs which match the species).

* When storing an i-Tree pair, use `(region, code)` instead of `(code, region)`
* When detecting diffs, use string version of i-Tree code field rather than pair version
* When displaying a diff, for the "imported value" use the value in the diff rather than the value in the row
* Fix `collected_fields` logic in `views._get_row_data`
Merge pull request #1827 from RickMohr/fix-itree-code-merging

Fix merging of i-Tree code field
Fixes a bug with a unit test failing at certain times of day.

https://travis-ci.org/OpenTreeMap/OTM2/builds/43048572 failed with the
following output:
 File "/home/travis/build/OpenTreeMap/OTM2/opentreemap/treemap/tests/dates.py",
 line 44, in test_mixed_tz_awareness_neq

 d2 = datetime(d1.year, d1.month, d1.day, d1.hour - 1)

 ValueError: hour must be in 0..23

The test took place at around 7:30PM ET, which would put it at 12:30PM UTC.
This caused d1.hour to be 0, which meant d1.hour - 1 was -1, and invalid value.