add asynchronous construction of csv, and semi-static serve (i.e. still served by flask, based on a cache value, but done using send_file, so optimised within the app)
fix merge in doaj.py