build: default to using -O2 for release builds

The -O3 optimization level can often lead to dangerous (and sometimes
incorrect) optimizations being performed.  So let's use a level that's
more stable.
Revert "build: don't download and extract tarball if source is already present"

This reverts commit 90658982644b76a9e8e4abfbcd16450df26b0a32.

It failed to work correctly on a fresh clone.  See #1433.
build: don't download and extract tarball if source is already present

When building under Homebrew, we want to let Homebrew manage
downloading and extracting the tarballs. See PR #1411.

Also make sure to skip only if directory is not empty. Fix #1433.
Merge pull request #1434 from xu-cheng/fix-1433

DownloadAndExtractFile.cmake: only skip if directory is not empty.
Merge pull request #1426 from jszakmeister/change-release-opt-default

build: default to using -O2 for release builds
Fix warnings: ex_cmds.c: do_ascii(): Garbage value (2): MI.

Problems   : Assigned value is garbage or undefined @ 127.
             Assigned value is garbage or undefined @ 152.
Diagnostic : Multithreading issues.
Rationale  : Error could only occurr if global `enc_utf8` changed while
             the function is executing.
Resolution : Use local copy of global var.
Fix warnings: ex_cmds.c: do_ecmd(): Np dereference: FP.

Problem    : Dereference of null pointer @ 2768.
Diagnostic : False positive.
Rationale  : `win_valid(oldwin)` implies `oldwin` not null.
Resolution : Assert `oldwin` not null.
Fix warnings: ex_cmds2.c: do_source(): Np dereference: FP.

Problem    : Dereference of null pointer @ 2462.
Diagnostic : False positive.
Rationale  : Error occurred if neither loop neither following if were
             entered (this implied `script_items.ga_len < 0`, which
             should not be possible).
Resolution : Assert not negative length (loop or if entered).
Fix warnings: ex_cmds2.c: do_source(): Unitialized arg (2): MI.

Problem    : Uninitialized argument value @ 2485.
             Uninitialized argument value @ 2507.
Diagnostic : Multithreading issues.
Rationale  : Error can only occur if globals `do_profiling`, `time_fd`
             are modified while function is executing.
Resolution : Use local copy of globals.
Fix warnings: ex_docmd.c: eval_vars(): Unitialized arg: FP.

Problem    : Uninitialized argument value @ 7704.
Diagnostic : False positive.
Rationale  : Error occurs if `switch(spec_idx)` doesn't enter any case,
             which should not occur after
             `spec_idx = find_cmdline_var(...)` returned non-negative.
Resolution : Add default clause to switch and error if reached.
Fix warnings: ex_eval.c: report_pending(): Np dereference: FP.

Problem    : Dereference of null pointer @ 711.
Diagnostic : False positive.
Rationale  : Codepath producing error invokes this function with values
             `action=RPC_DISCARD, pending=CSTP_FINISH, value=NULL`.
             Now, for some reason, the analyzer is remembering that
             `value` is null, and that `action` is `RPC_DISCARD`, but
             it's not remembering that `pending` is `CSTP_FINISH`.
             Then, it's taking the wrong branch in the switch for
             `pending`. That path would never occur invocating the
             function with those values.
Resolution : Assert function precondition between `pending` and `value`.
             This is, let the compiler know that `value` being null
             implies `pending` not being neither throw neither return.
Fix warnings: ex_getln.c: init_history(): Double free: FP.

Problem    : Double free @ 4249.
Diagnostic : False positive.
Rationale  : Codepath leading to error contains two consecutive
             iterations in which `if (--j < 0)` is true.
             That executes `free` two consecutive times with the same
             value (hislen - 1) for j, with leads to double free.
             Now, that can only happen with j == 0 && hislen == 1.
             And that would imply j == hisidx[type] too, which would
             take the following break.
             So, the error codepath cannot really happen, but the
             compiler cannot deduce the last implication.
Resolution : We have two possible solutions for this:
             1.- Comparing value of j before and after updating it,
                 and breaking out of iteration if equal.
                 That changes nothing in functionality, but teaches the
                 compiler his proposed error codepath is impossible.
             2.- Nullify pointer after freeing.
                 This way, the compiler still thinks his error codepath
                 is possible, but it's not an error anymore, as
                 free(NULL) is a no-op.
             We opt for solution 2, as solution 1 requires adding
             logic that adds nothing (and having to explain that clearly
             in aside comments) just for the purpose of silencing
             warning. On the other hand, solution 2 improves the code,
             adding something considered good practice in any case,
             and therefore doesn't require further explanation.