Hi Jim, most of my experience is with Lasagne, of course.
Your impression is correct. I would think of Lasagne as a Python module which provides convenience classes and functions for using Theano. In other words, common things that you'd want to do using Theano for neural networks (construct a computational graph corresponding to a neural network model and compute updates of it) are made very easy. The result of using Lasagne are Theano symbolic expressions which you can use to compile functions. Apart from convenience, one reason to use Lasagne instead of implementing everything yourself in Theano is that Lasagne is written to be highly efficient (many of the devs have also contributed to Theano) and bug-free (lots of people are using it).
Keras, in contrast, allows you to use Theano without writing any Theano code. This arguably makes it less flexible and less easily extensible but also potentially easier to use for people not familiar with Theano. For some time, Keras didn't support non-sequential models (e.g. tree structured networks with arbitrary connections), but I think that's possible now.