message: Add try/catch around all poplar Engine executions
  Summary:
  Host reads and writes can and do cause exceptions.  this change
  catches them rather than allowing them to terminate the process.
  Test Plan: all existing tests ok
  Reviewers: georgep
diff: @@ -548,6 +548,7 @@ std::tuple<se::DeviceMemoryBase, int64> PoplarExecutor::RemapArgs(
  Status PoplarExecutor::MoveDeviceToHost(TensorControl* tc) {
  void* buf(static_cast<void*>(tc->data));
  + try {
  if (tc->output_convertor) {
  current_engine_->readTensor(tc->output_handle, buf);
  std::vector<char> converted = tc->output_convertor(buf, 0, tc->size);
  @@ -563,6 +564,9 @@ Status PoplarExecutor::MoveDeviceToHost(TensorControl* tc) {
  tc->output_handle.clear();
  tc->input_handle.clear();
  return Status::OK();
  + } catch (std::logic_error& e) {
  + return tensorflow::errors::Internal("Poplar host read error: ", e.what());
  + }
  }
  StatusOr<se::DeviceMemoryBase> PoplarExecutor::GetTupleBufferByIndex(
  @@ -663,6 +667,7 @@ StatusOr<se::DeviceMemoryBase> PoplarExecutor::ExecuteEngine(
  // a) the engine has changed
  // b) it is not on the device
  // c) it is on the device, but in the wrong place
  + try {
  for (auto mem : arg_map) {
  TensorControl* tc = mem.second.tc;
  void* buf(static_cast<void*>(tc->data));
  @@ -687,11 +692,16 @@ StatusOr<se::DeviceMemoryBase> PoplarExecutor::ExecuteEngine(
  }
  }
  }
  + } catch (std::logic_error e) {
  + return tensorflow::errors::Internal(
  + "Poplar host write error ", e.what());
  + }
  std::tie(retbuf, tensor_count) =
  AllocateOutputBuffer(allocator, output_shape, 0, output_map, args,
  executable.OutputStreamed());
  + try {
  const auto& streamed = executable.OutputStreamed();
  std::vector<void*> bufs;
  FlattenedOutputDeviceMemoryList(bufs, output_shape, retbuf.opaque());
  @@ -701,7 +711,6 @@ StatusOr<se::DeviceMemoryBase> PoplarExecutor::ExecuteEngine(
  }
  }
  - try {
  current_engine_->run(0);
  }
  catch (std::logic_error e) {
  