message: Log in executor when a synchronous node is finished.
  Also log more info when an asynchronous node is finished.
  This is useful for debugging deadlocks and issues where a kernel does not return.
diff: @@ -1617,14 +1617,17 @@ void ExecutorState::Process(TaggedNode tagged_node, int64 scheduled_usec) {
  NodeExecStatsWrapper* stats = state->stats; // Shorthand
  Entry* first_input = state->first_input; // Shorthand
  - if (vlog_) {
  - VLOG(2) << this << " Async kernel done: "
  - << SummarizeNode(*state->item->node);
  - }
  nodestats::SetOpEnd(stats);
  EntryVector outputs;
  Status s = ProcessOutputs(*state->item, &state->ctx, &outputs, stats);
  nodestats::SetMemory(stats, &state->ctx);
  + if (vlog_) {
  + VLOG(2) << "Async kernel done: " << state->item->node->id()
  + << " step " << step_id_ << " "
  + << SummarizeNode(*state->item->node)
  + << " is dead: " << state->tagged_node.is_dead;
  + }
  +
  // Clears inputs.
  const int num_inputs = state->item->num_inputs;
  for (int i = 0; i < num_inputs; ++i) {
  @@ -1672,6 +1675,12 @@ void ExecutorState::Process(TaggedNode tagged_node, int64 scheduled_usec) {
  }
  if (!launched_asynchronously) {
  + if (vlog_) {
  + VLOG(2) << "Synchronous kernel done: " << id << " step "
  + << params.step_id << " " << SummarizeNode(*node)
  + << " is dead: " << tagged_node.is_dead;
  + }
  +
  // Clears inputs.
  const int num_inputs = item.num_inputs;
  for (int i = 0; i < num_inputs; ++i) {
  