Put all the ingredients for the marinade bar the yoghurt in a food processor with a tablespoon and a half of salt and blitz to a paste. Add the yoghurt and blitz again for 20 seconds, until smooth. Put the lamb in a large bowl, pour in the marinade and toss to coat. Cover and chill for at least three hours, and preferably overnight (if you do the latter, take the lamb out of the fridge an hour or so before cooking, to bring it back up to room temperature.
Heat the oven to 190C (170C fan)/375F/gas 5. Put the oil in a large, 28cm-wide, cast-iron saucepan for which you have a lid on a medium-high heat. Add half the tomatoes, onions and garlic and char, stirring, for three to five minutes, until nicely coloured and starting to soften. Transfer to a bowl and repeat with the other half of the tomatoes, onion and garlic.
Return the first batch of tomatoes, onion and garlic to the pan, then stir in the tomato paste, vinegar, scotch bonnets (if using), cinnamon, stock and quarter-teaspoon of salt. Add the lamb and all of its marinade, bring up to a simmer, then cover the pan and transfer to the oven to roast for two and a half hours.
Take off the lid and gently lift out the lamb on to a platter. Stir the coconut milk and beans into the pot, top with the lamb and return to the oven uncovered for a further 45-60 minutes, or until nicely browned and crusted. The lamb should by now be very tender. Remove from the oven and leave to rest for 15 minutes.
Meanwhile, make the salsa. In a medium bowl, mix the tomato, onion, coriander, lime juice and an eighth of a teaspoon of salt, then set aside.
To serve, carefully lift the lamb on to a board, then use a ladle to skim off and discard any excess fat from the liquid in the pan. Pour the bean mixture through a colander set over a bowl to catch the gravy, then transfer the bean mixture to a platter with a lip. Pour over half of the gravy, then top with the lamb and a few spoonfuls of the salsa, and serve with the remaining salsa and the extra gravy on the side.