One option hasn't yet been mentioned. I've had good luck with it in certain circumstances. The background is that the students were all eager and hard-working, but some had more experience and some were truly exceptional.
The basic idea is that you can provide two versions of a lab assignment. The first version covers the basics of what needs to be learnt. The second version is truly challenging and goes beyond, either in concepts or in difficulty of implementation. It could even have subtle elements that require deep thought.
Students (or teams) choose which assignment they will do. They are each "worth" the same amount for grading purposes and no-one has to do both. The assumption here is that the superstars probably would find the first version rather trivial and wouldn't learn a lot from doing it, but most students might find the second version frustrating.
Some of the superstars might choose the easy version, especially if it is done outside of class/lab time and they are otherwise busy, but you will find, with certain students, that the challenge of it intrigues them. You may also find that some students who lack the necessary background might want to do the advanced version. You might want to advise them otherwise or make some other adjustments. You might also provide a requirement or two in the background of students who want to do the advanced version.
These sorts of things take some experimentation, however. The first time you do it you might find that one version was too easy and the other too hard, requiring more time than was available. For the future you can adjust, but for the first run you may have to adjust how you assign grades. The big factor is that you require learning, not necessarily project completion.
You have to be very clear, of course, when presenting the two versions that one is a lot more challenging and that there is no "extra" credit for doing it. Don't mislead anyone.
The particular case I'm thinking of was a Database course that discussed both the theory and implementation of database systems (not just individual databases). Some of the algorithms used are also discussed in an Algorithms course. My recommendation to the students was that if they had already implemented something similar to the "easy" assignment they should do the other to avoid boredom. I was pleasantly surprised at how many students picked the harder problem and also how much the students picking the "easy" version learned from the exercise.