Finding approximate competitive equilibria: efficient and fair course allocation | Synapse