This function examines a dataframe and returns a list of the columns with sub-lists as all the options for factors. This provides programmatic access (and automcomplete) to the values available in a dataframe, and throws and early error if we try and access data by a variable that does not exist.