That might actually be pretty easy, just use conditionals on the getCMSFields function, check for fields set, and depending on which ones are already set, present a different set of fields.
$StepOneFields = new CompositeField(
new DropdownField('VenueID', 'Venue', Venu::get()->map())
);
$StepTwoFields = new CompositeField(
new GridField('Dates', 'Dates', $this->Dates())
);
$StepThreeFields = new CompositeField(
new GridField('CarParks', 'Car Parks', CarParks::get()->map())
);
if( !$this->ID ) $fields->addFieldToTab('Root.Main', $StepOneFields);
elseif( $this->ID && $this->VenueID ) $fields->addFieldToTab('Root.Main', $StepTwoFields);
elseif( $this->ID && empty($this->CarParks()) ) $fields->addFieldToTab('Root.Main', $StepThreeFields);
else // Add all 3 CompositeFields to FieldList