Handle interactivity and errors properly

Before this bug fix, it was exiting early, even when in interactive
mode.
diff --git a/src/bc/vm.c b/src/bc/vm.c
index 614998f..12e7ae0 100644
--- a/src/bc/vm.c
+++ b/src/bc/vm.c
@@ -149,12 +149,12 @@
 
     status = vm->exec(&vm->program);
 
-    if (status) goto read_err;
-
     if (bcg.bc_interactive) {
 
       fflush(stdout);
 
+      if (status) bc_error(status);
+
       if (bcg.bc_signal) {
 
         status = bc_vm_signal(vm);
@@ -163,9 +163,14 @@
         fflush(stderr);
       }
     }
-    else if (bcg.bc_signal) {
-      status = bc_vm_signal(vm);
-      goto read_err;
+    else {
+
+      if (status) goto read_err;
+
+      if (bcg.bc_signal) {
+        status = bc_vm_signal(vm);
+        goto read_err;
+      }
     }
   }
   else status = BC_STATUS_EXEC_FILE_NOT_EXECUTABLE;
@@ -304,10 +309,7 @@
           bc_program_limits(&vm->program);
           status = BC_STATUS_SUCCESS;
         }
-        else {
-          bc_error(status);
-          goto exit_err;
-        }
+        else goto exit_err;
       }
     }
     else if (status == BC_STATUS_PARSE_QUIT) {
@@ -364,23 +366,25 @@
 
       status = vm->exec(&vm->program);
 
-      if (status) {
-        bc_error(status);
-        goto exit_err;
-      }
-
       if (bcg.bc_interactive) {
 
         fflush(stdout);
 
+        if (status) bc_error(status);
+
         if (bcg.bc_signal) {
-          status = bc_vm_signal(vm);
+          if ((status = bc_vm_signal(vm))) bc_error(status);
           fprintf(stderr, "%s", bc_program_ready_prompt);
         }
       }
-      else if (bcg.bc_signal) {
-        status = bc_vm_signal(vm);
-        goto exit_err;
+      else {
+
+        if (status) goto exit_err;
+
+        if (bcg.bc_signal) {
+          status = bc_vm_signal(vm);
+          goto exit_err;
+        }
       }
     }
 
@@ -394,6 +398,8 @@
 
 exit_err:
 
+  bc_error(status);
+
   free(buf);
 
 buf_err: