Fixes and cleanups for local ensembles

A handful of patches for local ensembles and predictions:

  -  We don't re-download models with each invocation to `LocalEnsemble.predict()`.
  - Simplifications to `LocalEnsemble` since we are not really supporting properly segmented model downloads.
  - New class `CSVReader`, to easily iterate local CSVs as inputs for making predictions.
  - Trailing whitespace cleanups (sorry about mixing them here!).