## Step 1: Define the symbolic variables
Let's define the symbolic variables for the quantities of crab soup and lobster soup to be produced. We denote the quantity of crab soup as $x_1$ and the quantity of lobster soup as $x_2$.

## Step 2: Formulate the objective function
The profit per serving of crab soup is $3, and the profit per serving of lobster soup is $5. Therefore, the objective function to maximize profit is $3x_1 + 5x_2$.

## 3: Define the constraints
- A serving of crab soup requires 7 units of water, and a serving of lobster soup requires 10 units of water. There are 80 units of water available. This gives the constraint $7x_1 + 10x_2 \leq 80$.
- A serving of crab soup requires 8 units of crab meat. There are 65 units of crab meat available. This gives the constraint $8x_1 \leq 65$.
- A serving of lobster soup requires 5 units of lobster meat. There are 55 units of lobster meat available. This gives the constraint $5x_2 \leq 55$.
- Non-negativity constraints: $x_1 \geq 0$ and $x_2 \geq 0$, since the quantities of soups cannot be negative.

## 4: Symbolic representation
The symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'crab soup'), ('x2', 'lobster soup')],
    'objective_function': '3*x1 + 5*x2',
    'constraints': [
        '7*x1 + 10*x2 <= 80',
        '8*x1 <= 65',
        '5*x2 <= 55',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

## 5: Gurobi code
Now, let's implement this linear programming problem using Gurobi in Python:
```python
import gurobi

def solve_soup_problem():
    # Create a new model
    model = gurobi.Model()

    # Define the variables
    x1 = model.addVar(name='crab_soup', lb=0, ub=gurobi.GRB.INFINITY)
    x2 = model.addVar(name='lobster_soup', lb=0, ub=gurobi.GRB.INFINITY)

    # Define the objective function
    model.setObjective(3*x1 + 5*x2, gurobi.GRB.MAXIMIZE)

    # Define the constraints
    model.addConstr(7*x1 + 10*x2 <= 80, name='water_constraint')
    model.addConstr(8*x1 <= 65, name='crab_meat_constraint')
    model.addConstr(5*x2 <= 55, name='lobster_meat_constraint')

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print('Optimal solution found.')
        print(f'Quantity of crab soup: {x1.varValue}')
        print(f'Quantity of lobster soup: {x2.varValue}')
        print(f'Maximum profit: {model.objVal}')
    else:
        print('No optimal solution found.')

solve_soup_problem()
```