add ensureIndices to create indexes for faster searching

If the indices don't exist, it takes a while (several tens of minutes)
to create them and increases the file size. Not sure how much they
help speed up select queries so the usefulness should be tested.
add metersBetweenLatLonPair and printCurrentTime functions

metersBetweenLatLonPair is a copy of Jacob Lynn's version in pygtfs,
but returns meters instead of km and uses numpy instead of math
functions. It implements a great circle distance approximation and is
vectorized so it works much faster than geopy on large lists.

printCurrentTime just prints the ISO formatted time for quick
debugging/logging.
speed up time and distance conversions, clean encoding, validate knn

Add several functions that should duplicate calculations
(unixmsToWeekSecs, lanlonToMeters, etc) but perform much faster with
vectorization. These need to be tested for consistency and speed, and
the slower ones can be deleted. In particular, the new time functions
have different (probably incorrect) timezones and the start of the
week is Thursday.

Split off the label encoding from preprocess into its own
function. KNN doesn't like it when the test set has labels (trip_ids)
that aren't found in the training set, so now we join the test and
training labels in the encoder object.

Once KNN is fit, use its built-in score method to check accuracy and
use the metrics submodule to generate and plot the confusion matrix.
add plotConfusionMatrix based on sklearn example