This is a part answer and in no way complete. I'd also keen to find out more about both of these. So this may be part of a discussion; although I have written as an answer rather than comment because of the following code snippets and examples of how I've used the above classes.
Let me illustrate some of my uses prepareRow() as - which does as it says.
A recently I was giving some data to import from a non drupal database. The entity I am adding to requires fields to be entered that I do not have in my data import.
So before my source class is created I can add
$source_fields = array(
'changed' => t('Timestamp of when the change was made.'),
'created' => t('Timestamp of when the node was Created.'),
);
and then in the function prepareRow I can do the following
$nowtimestamp = mktime(date('Y-m-d'));
$row->changed = $nowtimestamp;
$row->created = $nowtimestamp;
you can also run php if/else statements here if necessary.
I've also used the prepare function in my code and am using it to assign values to the entity.
$account->field_job_location [und][0]['tid'] = $row->job_location_tid;
I've only had to use this in this scenario as I made my own custom node plugin.
Also if you need to make calculations on that then you can do it in prepareRow which runs before prepare()
For example in the import I had a value labelled 'Town' - and could turn this into a Term Id.
if ($TownCity == 'London' ){
$row->job_location_tid = '10';
} else {
$row->job_location_tid = '11';
}
I hope this helps.