Compiling finite element variational forms for GPU-based assembly