Generate samples using the C++ noisy trajectory simulator.

Simulate the final state of programs given symbol_values are placed inside of the symbols with the name in symbol_names in each circuit. Channels in this simulation will be "tossed" to a certain realization during simulation. After each simulation is a run a single bitstring will be drawn. These simulations are repeated num_samples times.

# Sample a noisy circuit with C++.
qubit = cirq.GridQubit(0, 0)
my_symbol = sympy.Symbol('alpha')
my_circuit_tensor = tfq.convert_to_tensor([
        cirq.X(qubit) ** my_symbol,
my_values = np.array([[0.123]])
my_num_samples = np.array([100])
# This op can now be run with:
output = tfq.noise.samples(
    my_circuit_tensor, ['alpha'], my_values, my_num_samples)
<tf.RaggedTensor [[[0], [0], [1], [0], [0], [0], [0], [1], [0], [0]]]>

programs tf.Tensor of strings with shape [batch_size] containing the string representations of the circuits to be executed.
symbol_names tf.Tensor of strings with shape [n_params], which is used to specify the order in which the values in symbol_values should be placed inside of the circuits in programs.
symbol_values tf.Tensor of real numbers with shape [batch_size, n_params] specifying parameter values to resolve into the circuits specified by programs, following the ordering dictated by symbol_names.
num_samples tf.Tensor with one element indicating the number of samples to draw for all circuits in the batch.

A tf.Tensor containing the samples taken from each circuit in programs.