text: Title: [FEA] modularly-weighted layouts
  Body: **Is your feature request related to a problem? Please describe.**
  
  Often we have modular structure annotated with a graph, like community scores, and we'd like the layout to reflect it more than a basic force-directed layout would, see image below
  
  **Describe the solution you'd like**
  
  ```python
  # auto modes
  g.layout_modular().plot()
  g.layout_modular(algorithm='leiden').plot()
  
  
  # controls
  g.compute_cugraph('leiden').layout_modular(
    node_attr='leiden',
    algorithm=None,
    engine='gpu',
    intra_edge_weight=3.0
  ).plot()
  ```
  
  This would translate to something like:
  
  ```python
  def layout_modular(
    g: Plottable,
    node_attr: Optional[str] =None,
    algorithm: Optional[str]='leiden',
    engine: Literal['cpu', 'gpu', 'any'] = 'any',
    intra_edge_weight=2.0,
    inter_edge_weight=0.5,
    edge_influence=2.0
  ) -> Plottable:
    if node_attr is None:
      # compute community via igraph or cugraph algorithm depending on env/engine/etc
      node_attr = algorithm
      ...
    e_annotated = annotate_src_dst_with_node_attr(g._edges, node_attr, 'src_attr', 'dst_attr')
    e_weighted = g._edges.assign(weight=(e_annotated['src_attr'] == e_annotated['dst_attr']).map({
      True: intra_edge_weight,
      False: inter_edge_weight
    })
    g2 = g.edges(e_weighted).settings(url_params={'edgeInfluence': 2})
    return g
  ```
  
  It should work in both pandas + cudf modes
  
  **Additional context**
  
  * binding edge weights in pygraphistry:
  https://github.com/graphistry/pygraphistry/blob/master/demos/more_examples/graphistry_features/edge-weights.ipynb
  
  * expected output:
  ![image](https://github.com/user-attachments/assets/8464ac5c-2660-408d-bcdc-cc97b22d0252)
  