Keeping UI responsive while performing long running task
1) I would use the ProgressChanged event with a custom object as my e.UserState which is updated within the code.

// sample worker state class definition
internal class WorkerState
{
    public Exception ExceptionThrown { get; set; }
    public string ProgressMessage { get; set; }
    public int MaximumProgressValue { get; set; }
    public int ProgressValue { get; set; }
    public int Actions { get; set; }
} 


Sample Usage

// this would likely be initialized / reinitiatlized before the RunWorkerAsync is called
private WorkerState m_WorkerState; 

private void buttonUpdateContacts_Click(object sender, EventArgs e)
{
    // for question 2) this could be convered into some form of
    // factory where providing delegates for the ProgressChange and WorkCompleted
    BackgroundWorker worker = new BackgroundWorker();       

    worker.UserState = new WorkerState();

    worker.WorkerReportsProgress = true;      
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);     
    worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);   
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);   
    worker.RunWorkerAsync();      
}                

void worker_DoWork(object sender, DoWorkEventArgs e)         
{ 
    Worker worker = (sender as BackgroundWorker);
    WorkerState state = worker.UserState;

    state.UserState.ProgressMessage = "Parsing word document...";
    state.UserState.MaximumProgressValue = 100;
    state.UserState.ProgressValue = 0;

    worker.ReportProgress(0, state);          

    // ...

    try
    {
        // do something
    }
    catch (InvalidCredentialsException argumentException)
    {
        e.ExceptionThrown = argumentException;
        return;
    }
    catch (ArgumentNullException nullArg)
    {
        e.ExceptionThrown = nullArg;
        return;
    }

    // ..
} 


2) There is not too much wrong with putting the code in the button click event but you could make better use of OO concepts like factories for creating the BackgroundWorker component etc. I personally would split the bulk of the code in the DoWork method into seperate classes following SOLID principles (especially the Single Responsibility... this class is responsible for blah, blah blah).

3) Tasks are likely to be unsuitable in this case as this is exactly what the BackgroundWorker component was designed for.